選擇排序的原理是首先取第一個數字做爲數組中的最小者minValue(以升序排序爲例),依次跟後續數字進行比較,若是發現有比minValue更小的數字,記錄該數字的下標,並將該數字的值賦給minValue,直到遍歷完數組的最後一個數字。而後根據記錄的實際最小值的下標,跟第一個數字進行交換。數組
第一趟比較執行完後就找到了數組中最小者,而後再從下一個數字開始,重複執行前面的步驟,直到倒數第二個數字比較完爲止(最後數字無需比較即爲最大數字)dom
假設要排列的數字爲 3 1 4 2 ,當進行第一趟排序時,以下圖所示(其中i表示數組的下標)測試
第一趟排序後,數組中最小的數字1已找到並放置在第0位置。下面看第二趟比較,以下圖所示。spa
第二趟比較從第二個數開始,將minIndex設置爲1,並將minValue設置爲4。並依次跟後面的數比較,發現3<4,將minIndex和minValue修改成對應值。繼續向後比較發現2<3,將minIndex和minValue修改成對應值。第二趟遍歷結束,將第1位置的值設置爲minIndex對應的值2,並將minIndex值設置爲4。第二趟比較結束。繼續執行第三趟排序(雖然咱們看到如今數組已經有序,但程序不知道)。第三趟比較以下圖所示code
第三趟比較時,將minIndex設置爲2,minValue設置爲3。依次向後比較,4>3不改變minIndex和minValue。遍歷結束,無需進行交換(經過趟數值與minIndex值是否相等來判斷是否須要交換)blog
1 public static void sort(int array[]){ 2 //第一個for循環表示要進行length-1次選擇 3 for (int i = 0; i < array.length - 1; i++) { 4 int minIndex = i; 5 int minValue = array[minIndex]; 6 for (int j= i+1; j<array.length; j++){ 7 if(minValue > array[j]){ 8 minIndex = j; 9 minValue = array[j]; 10 } 11 } 12 //執行完一輪選擇後進行交換(若是最小值下標有改變才進行交換) 13 if(minIndex != i){ 14 array[minIndex] = array[i]; 15 array[i] = minValue; 16 } 17 } 18 }
1)第一層for循環肯定比較趟數,經過咱們的分析,比較n-1趟便可(n爲數組長度)排序
2)第二層for循環用於遍歷所選擇的最小值後續數字,比較是否有小於所選擇的最小值,若是有,則修改minIndex和minValuefor循環
3)if提交判斷,用於斷定minIndex是否被修改過,若是沒有修改過,則無需交換(不然本身與本身交換,無心義)class
選擇排序有兩層for循環,所示時間複雜度爲T(n)=O^2原理
與上一篇冒泡排序相同,依然生成10萬個數字進行排序。代碼以下
1 public static void main(String []args){ 2 int array[] = new int[100000]; 3 for (int i = 0; i < 100000; i++) { 4 array[i] = (int) (Math.random()*1000000); 5 } 6 long begin = System.currentTimeMillis(); 7 sort(array); 8 System.out.println("總耗時="+(System.currentTimeMillis()-begin)); 9 }
能夠看出,在個人機器上使用選擇排序對10萬個數字的數組進行排序,大概須要3秒多的時間,比冒泡排序的17秒快了不少。下一篇我將講解插入排序的過程,耗時會不會更小呢?一塊兒期待!!!
選擇排序須要注意兩點,一是比較的趟數,有n個數,比較n-1便可。二是每趟比較,都認爲當前數爲最小(或最大)值,而後依次跟後面數字比較,若是發現有比咱們假設的最小值更小,則改變成新的下標和新的最小值繼續向後比較,直到遍歷完全部數字。若是假設的最小值下標有修改則進行交換。