之前寫到過冒泡排序。但是,冒泡排序需要一個個比較,交換位置。這樣會有很多的讀寫操作,會影響cpu效率。所以,出現了選擇排序。選擇排序,每次循環選擇最小的數字與這次循環的第一位置的數字,交換位置,直至最後。舉個例子,說明一下:
7 | 2 | 5 | 1 | 3 | 4 | 8 | 6 |
第一輪:
1. 7 和2比較,2小,最小變量minNumber=2;
2. 2和5比較, 2小,最小變量minNumber=2;
3. 2和1比較,1小,最小變量minNumber=1;
4. 1和3比較,1小,最小變量minNumber=1;
5. 1和4比較,1小,最小變量minNumber=1;
6. 1和8比較,1小,最小變量minNumber=1;
7. 1和6比較,1小,最小變量minNumber=1,1和7交換;
1 | 2 | 5 | 7 | 3 | 4 | 8 | 6 |
第二輪:
1. 2和5比較,2小,最小變量minNumber=2;
2. 2和7比較,2小,最小變量minNumber不變;
3. 2和3比較,2小,最小變量minNumber不變;
4. 2和4比較,2小,最小變量minNumber不變;
5. 2和8比較,2小,最小變量minNumber不變;
6. 2和6比較,2小,最小變量minNumber不變;
1 | 2 | 5 | 7 | 3 | 4 | 8 | 6 |
第三輪:
1 | 2 | 3 | 7 | 5 | 4 | 8 | 6 |
第四輪:
1 | 2 | 3 | 4 | 5 | 7 | 8 | 6 |
第五輪:
1 | 2 | 3 | 4 | 5 | 6 | 8 | 7 |
第六輪
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
代碼如下:
private int[] choseSort1(int[] array) {
int temp;
for (int i = 0; i < array.length; i++) {
temp = i;
for (int j = i + 1; j < array.length; j++) {
temp = array[j] < array[temp] ? j : temp;
}
if (temp != i) {
array[i] ^= array[temp];
array[temp] ^= array[i];
array[i] ^= array[temp];
}
}
return array;
}
優點: 減少了冒泡排序的每次交換;
缺點:不穩定,之前數字大小一樣的值,相對位置可能改變。