選擇排序(Selction Sort)
基本思路:選擇某個索引位置的元素,然後和後面的元素依次比較,若大於則交換位置,經過第一輪比較排序後可以得出最小值,然後使用同樣的方法把剩下的元素逐個比較即可。
可以看出選擇排序,第一輪會選出最小值,第二輪會選擇第二個小的值,直到最後。
第一輪從arr[0]和後面的元素比較,第二輪從arr[1]和後面的元素比較,一次類推n個元素要進行n-1輪。選擇排序每一輪只進行一次交換,相對於冒泡排序效率高一些。
圖解:前三次比較arr[0]都是小的,所以沒有交換,第四次比較的時候arr[0]更大,交換位置。
下面我們來看看代碼怎麼寫的:
// 選擇排序,分析 找規律
public static void selectionSort(int[] arr){
// 第一輪
for (int i=1; i<=arr.length-1; i++){
if (arr[0] > arr[i]){
// 交換順序
int tmp = arr[0];
arr[0] = arr[i];
arr[i] = tmp;
}
}
// 第二輪
for (int i=2; i<=arr.length-1; i++){
if (arr[1] > arr[i]){
// 交換順序
int tmp = arr[1];
arr[1] = arr[i];
arr[i] = tmp;
}
}
// 第二輪
for (int i=3; i<=arr.length-1; i++){
if (arr[2] > arr[i]){
// 交換順序
int tmp = arr[2];
arr[2] = arr[i];
arr[i] = tmp;
}
}
//...
//...
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
找到規律,最後代碼簡化如下:
/**
* 選擇排序
* @param arr
*/
public static void selectionSort(int[] arr){
for (int times=1; times<=arr.length-1; times++){
for (int i=times; i<=arr.length-1; i++){
if (arr[times-1] > arr[i]){
// 交換順序
int tmp = arr[times-1];
arr[times-1] = arr[i];
arr[i] = tmp;
}
}
}
}