演算法學習——選擇排序
阿新 • • 發佈:2019-01-09
選擇排序,顧名思義就是要把元素選擇出來進行排序,要選擇,肯定就要有比較,這個時候我們的兩層for迴圈就派上用場了。
假設我們要對一個數組a進行排序,我們要定義兩個臨時變數(替身),一個是為陣列中順序即將發生變化的元素做替身,一個是為了代替陣列的下標,首先第一層for,我們要選出陣列的第一個元素a[0],用一個臨時變數temp代替a[0](temp = a[0]),用臨時變數flag代替陣列的下標,方便在第二層for中同陣列中的其它元素作比較,假設我們要將陣列升序排序,那麼在第二層for中,如果出現比a[0]小的數,就使temp等於該數的值,同時記錄下標的位置,第二層迴圈結束後,如果temp的值發生改變(下標的位置發生改變),那麼我們就讓a[0]等於temp,對應改變後的下標的位置處的值等於a[0],這就完成了第一趟排序,之後的第二趟、第三趟只要從a[1]、a[2]開始(由第一層for迴圈控制),以此類推,這樣每次都會選出剩下的數中最小的數放在第i位上,所以叫做選擇排序,當第一層for迴圈進行到陣列的最後一個元素時,排序完成。
簡單流程為:
int[] a = {54,21,69,23,45};
第一趟排序後元素的順序為:[21],54,69,23,45
第二趟排序後元素的順序為:[21],[23],69,54,45
第三趟排序後元素的順序為:[21],[23],[45],54,69
第四趟排序後元素的順序為:[21],[23],[45],[54],69
第五趟排序後元素的順序為:[21],[23],[45],[54],[69]
因未執行到的迴圈中的數的大小是不可預知的,所以迴圈會一直執行到最後,選擇排序的時間複雜度為O(n²)不變。
程式碼及測試結果如下:
package pp.suanfa; /** * 選擇排序 * * @author Administrator * */ public class chooseSort{ public static void cSort(int a[]){ int temp = 0; int flag = 0; for(int i=0;i<a.length;i++) { temp = a[i];//取出a[i]的值 flag = i;//取出i的值 for(int j=i+1;j<a.length;j++) { if(temp>a[j])//將a[i]與a[i]後面的元素進行比較,若a[i]>a[j]則將a[j]的值取出 { temp = a[j]; flag = j; } } if(flag!=i) { a[flag] = a[i];//此時將a[i]與最終的a[j]值互換 a[i] = temp; } } } public static void main(String[] args){ int a[] = {35,21,46,15,53}; cSort(a); for(int i=0;i<a.length;i++) { System.out.print(a[i]+" "); } System.out.println(); } }