概念介紹
有同學想了解選擇排序,今天它來了!選擇排序的核心思想是:從待排序的數據中選出最小的元素放在起始位置,然后再從剩余的未排序元素中尋找到最小的元素,放到已排序的序列的末尾!其時間復雜度為O(n²)。
還是用栗子來說明大家會更容易理解一些:咱們要對[2,7,-5,30,9]這五個數使用選擇排序進行排序。
初始序列:[2,7,-5,30,9],使用min記錄最小值,minIndex記錄最小值的下標。
第一輪:我們的目標是找到最小的數,放到第一位。
第一次:默認第一的元素為最小值,即min=2,minIndex=0,[2,7,-5,30,9],比較當前最小值2與7,7比2大,不做任何操作。
第二次:[2,7,-5,30,9],比較當前最小值2與-5,2比-5大,此時最小值應該發生改變,即修改min=-5,minIndex=2。
第三次:[2,7,-5,30,9],比較當前最小值-5與30,,30比-5大,所以不做操作。
第四次:[2,7,-5,30,9],比較當前最小值-5與9,9比-5大,同樣不做任何操作。
第一輪結束后,我們找出當前的最小值及最小值下標min=-5,minIndex=2,這時候,我們將-5與2進行交換,完成第一輪遍歷操作,交換后序列為:[-5,7,2,30,9]
第二輪:我們的目標是,找出除了-5以外的最小值,讓它排在第2位,Let's go!
第一次:默認除了-5外的第一個元素為最小值,即min=7,minIndex=1,[-5,7,2,30,9],比較當前最小值7與2,7比2大,此時最小值應該發生改變,即修改min=2,minIndex=2。
第二次:[-5,7,2,30,9],比較當前最小值2與30,,30比2大,所以不做操作。
第三次:[-5,7,2,30,9],比較當前最小值2與9,9比7大,同樣不做任何操作。
第二輪結束后,我們找到了除了-5以外的最小值2,同樣的,讓7與2進行交換,完成第二輪遍歷操作,交換后序列為:[-5,2,7,30,9]。
第三輪:我們的目標是,找出除了2以外的最小值,讓它排在第3位。
第一次:默認除了2外的第一個元素為最小值,即min=7,minIndex=2,[-5,2,7,30,9],比較當前最小值7與30,30比9大,所以不做操作。
第二次:[-5,2,7,30,9],比較當前最小值2與9,9比7大,同樣不做任何操作。
第三輪結束后,我們發現min=7,minIndex=2,剛好序列的第三位7,所以同樣不需要做任何操作。
第四輪:我們的目標是,找出除了7以外的最小值,讓它排在第4位。
第一次:默認除了7外的第一個元素為最小值,即min=30,minIndex=3,[-5,2,7,30,9],比較當前最小值30與9,30比9大,此時最小值應該發生改變,即修改min=9,minIndex=4。
第四輪結束后,我們找到了除了7以外的最小值9,同樣的,讓30與9進行交換,交換后序列為[-5,2,7,9,30],此時排序完成。
代碼實現
只要理解了排序的思路,代碼的實現就很簡單了!
1 public static void selectSort(int[] arr) { 2 // 遍歷從數組的第一位開始 3 for (int i = 0; i < arr.length - 1; i++) { 4 // 每輪遍歷開始前,默認第一個數為最小值 5 int min = arr[i]; 6 // 同時記住最小值的下標 7 int minIndex = i; 8 for (int j = i + 1; j < arr.length; j++) { 9 // 通過對比找出最小值 10 if (min > arr[j]) { 11 min = arr[j]; 12 minIndex = j; 13 } 14 } 15 if (minIndex != i) { 16 // 每輪結束后,將頭結點與最小值進行交換 17 arr[minIndex] = arr[i]; 18 arr[i] = min; 19 } 20 } 21 }
至此,代碼編寫完成,Git地址:https://github.com/HollowCup/algorithms-and-data-structure,具體實現位於algorithm工程下的sort目錄SelectSort,如果發現不足之處,請聯系我進行更改,十分感謝!關注我,為你揭秘更多排序算法!