簡單選擇排序思想:首先,找到數組中最小的元素,其次,將它和數組第一個元素交換位置;再次,在剩下的元素中找到最小的元素,將它與數組中的第二個元素交換。如此亡故,直到將整個數組排序。
這種方法叫做選擇排序,因為它在不斷地選擇剩余元素之中的最小者。
先說看每步的狀態變化,后邊介紹細節,現有無序數組[6 2 4 1 5 9]
第一趟找到最小數1,放到最前邊(與首位數字交換)
交換前:| 6 | 2 | 4 | 1 | 5 | 9 |
交換后:| 1 | 2 | 4 | 6 | 5 | 9 |
第二趟找到余下數字[2 4 6 5 9]里的最小數2,與當前數組的首位數字進行交換,實際沒有交換,本來就在首位
交換前:| 1 | 2 | 4 | 6 | 5 | 9 |
交換后:| 1 | 2 | 4 | 6 | 5 | 9 |
第三趟繼續找到剩余[4 6 5 9]數字里的最小數4,實際沒有交換,4待首位置無須交換
第四趟從剩余的[6 5 9]里找到最小數5,與首位數字6交換位置
交換前:| 1 | 2 | 4 | 6 | 5 | 9 |
交換后:| 1 | 2 | 4 | 5 | 6 | 9 |
第五趟從剩余的[6 9]里找到最小數6,發現它待在正確的位置,沒有交換
排序完畢輸出正確結果[1 2 4 5 6 9]
第一趟找到最小數1的細節
當前數組是| 6 | 2 | 4 | 1 | 5 | 9 |
先把6取出來,讓它扮演最小數
當前最小數6與其它數一一進行比較,發現更小數就交換角色
當前最小數6與2比較,發現更小數,交換角色,此時最小數是2,接下來2與剩余數字比較
當前最小數2與4比較,不動
當前最小數2與1比較,發現更小數,交換角色,此時最小數是1,接下來1與剩余數字比較
當前最小數1與5比較,不動
當前最小數1與9比較,不動,到達末尾
當前最小數1與當前首位數字進行位置交換,如下所示
交換前:| 6 | 2 | 4 | 1 | 5 | 9 |
交換后:| 1 | 2 | 4 | 6 | 5 | 9 |
完成一趟排序,其余步驟類似
選擇排序有兩個明顯的特點:
1.運行時間跟輸入無關。
為了找出最小元素而掃描一遍數組并不能為下一次掃描提供任何信息。
2.數據移動是最少的。
每次交換都會改變兩個數組元素的值。
代碼實現(僅供參考):
public class SelectionSort {public int[] selectSort(int[] A, int n) {for (int i = 0; i < n; i++) {int minIndex = i;//最小元素的索引int min = A[i];//最小元素for (int j = i; j < n; j++) {if (A[j] < min) {min = A[j];minIndex = j;}}if (minIndex != i) {int temp = A[i];A[i] = A[minIndex];A[minIndex] = temp;}}return A;}public static void main(String args[]) {int A[] = { 2, 1, 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 };int n = A.length;SelectionSort selectionSort = new SelectionSort();double start = System.currentTimeMillis();int B[] = selectionSort.selectSort(A, n);for (int i = 0; i < n; i++)System.out.print(B[i] + ",");double end = System.currentTimeMillis();System.out.println("\n程序運行時間:" + (end - start) + "毫秒");}
}
程序運行時間:2.0毫秒