原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后或者最前,直到全部记录排序完毕。
举个简单栗子来说明int[] arr={6,3,4,9,1,2};
第一趟排序: 原始数据:6 3 4 9 1 2
最小数据1,把1放在首位,也就是1和6互换位置,
排序结果:1 3 4 9 6 2
第二趟排序: 原始数据为除1以外的其余数据 3 4 9 6 2
最小数据2,把2放在首位,也就是2和3互换位置,
排序结果:1 2 4 9 6 3
第三趟排序: 原始数据为除1,2以外的其余数据 4 9 6 3
最小数据3,把3放在首位,也就是3和4互换位置,
排序结果:1 2 3 9 6 4
第四趟排序: 原始数据为除1,2,3以外的其余数据 9 6 4
最小数据4,把4放在首位,也就是4和9互换位置,
排序结果:1 2 3 4 6 9
第五趟排序: 原始数据为除1,2,3,4以外的其余数据 6 9
最小数据6,把6放在首位
排序结果:1 2 3 4 6 9
按照图上的顺序就是:for循环进行比较,定义一个第三个变量temp,首先前两个数比较,把较小的数放在temp中,然后用temp再去跟剩下的数据比较,如果出现比temp小的数据,就用它代替temp中原有的数据。
所以最终的排序方法可以这么写
//选择排序的优化
for(int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
int k = i;
for(int j = k + 1; j < arr.length; j++){// 选最小的记录
if(arr[j] < arr[k]){
k = j; //记下目前找到的最小值所在的位置
}
}
//在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
if(i != k){ //交换a[i]和a[k]
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}