思路:就是把所有數據項掃描一遍,挑出最小的那個和最左邊的交換位置,即放到0位置。現在最左邊的就是有序得了,不需要在交換位置,再次掃描數據時就是從1開始,還是尋找最小的和1交換位置,直到所有數據都是有序的。選擇排序的比較次數與冒泡排序相同,都是N-1次(不懂爲什麼是N-1次的去看這篇文章https://blog.csdn.net/qq_43196107/article/details/86526739),但是交換次數少於冒泡排序,每趟排序只有最後一次交換,前面的比較都是下標賦值
下面舉例說明:
int[] arg = {6,3,8,2,9,1}
int min = 0
第一趟排序:
第一次3和6比較,3小於6,min = 1
第二次從min=1開始比較:8和3比較,8大於3,繼續不賦值
第三次2和3比較,2小於3,min = 3
第四次從min = 3開始比較,9大於2,繼續不賦值
第五次1和2比較,1小於2,min = 5
將下標0和下標5進行交換
第一趟總共進行了 5次比較 1次交換, 排序結果: 1,3,8,2,9,6
第二趟排序(從3開始向後比較):
第一次3和8比較,8大於3,繼續不賦值
第二次2和3比較,2小於3,min = 3
第三次從min = 3開始比較,9 大於2,繼續不賦值
第四次從min = 3開始比較,6大於2,不賦值,循環結束
將下標1和下標3進行交換
第二趟總共進行了4次比較 1次交換, 排序結果: 1,2,8,3,9,6
第三趟排序(從8開始向後比較):
第一次3和8比較,3小於8,min = 3
第二次從min = 3開始比較,9大於3,繼續不賦值
第三次從min = 3開始比較,6大於4,繼續不賦值結束循環
將下標2和下標3進行交換,
第二趟總共進行了3次比較 1次交換, 排序結果: 1,2,3,8,9,6
第四趟排序(從8開始向後比較):
第一次8和9比較,9大於8,繼續不賦值
第二次8和6比較,6小於8,min = 5結束循環
將下標3和下標5進行交換
第二趟總共進行了2次比較 1次交換, 排序結果: 1,2,3,6,8,9
第五趟排序(從8開始向後比較):
第一次8和9比較,9大於8,不賦值結束循環
第二趟總共進行了1次比較 0次交換, 排序結果: 1,2,3,6,8,9
代碼實現:
外層循環用變量out,從數組開頭開始(數組下標爲0)向高位增長。內層循環用循環變量in,從out所指位置開始,同樣是向右移位,在每一個in的新位置數據項array[in]和array[min]進行比較,如果a[in]更小,則min被賦值爲in的值,在內層循環的最後,min被指向最小的值,然後交換out和min指向的數組數據項
public static void selectSort(int[] array) {
int out,in,min = 0;
for (out = 0; out<array.length-1; out++) {
min = out;
for (in = out; in<array.length; in++) {
if (array[in] < array[min]) {
min = in;
}
}
swap(out, min);
}
}
public static void swap(int one, int two) {
int temp = ii[one];
ii[one] = ii[two];
ii[two] = temp;
}
不變性:下標小於或等於out位置的數據總是有序的