快速排序,選擇排序,氣泡排序
阿新 • • 發佈:2019-02-04
一。快速排序
- 從數列中選取一個數作為基數用於比較,記為cardinal
- 將大於cardinal的數全部放在右邊,將小於cardinal的數全部放在左邊,進行分割槽
- 再對左右兩邊的分割槽重複進行第二步,直到分割槽只有一個數
快速排序是基於分治策略的,分治策略常用的解決方法就是二分法,遞迴解決
上面用圖走了一遍第一次快速排序,這種方法是左右交換的辦法比較實用,還有挖坑填值法,可以自去看看,下面是java程式碼的實現
public static void quickSort2(int[] num,int left,int right){ if(left<right){ int port = num[left]; int L = left+1; int R = right; while(L<=R){ /*從右邊找比基數小的數*/ while(L<=R && num[R]>port)R--; /*左邊開始找 比基數大的值*/ while(L<=R && num[L]<=port)L++; /*當找到兩個符合條件的數,交換兩個數*/ if(L<R){ int temp = num[L]; num[L] = num[R]; num[R] = temp; /*越過這兩個數,以為已經比較替換了*/ L++; R--; } } /*當找不到同時符合兩個條件的數的時候,把此時右邊的數和基數替換*/ int temp = num[R]; num[R] = port; num[left] = temp; /*遞迴排序左邊和右邊的*/ quickSort2(num,R+1,right); quickSort2(num,left,R-1); } }
二。氣泡排序
- 氣泡排序:如果升序,左邊第一個數和剩餘的數比較一發現有比自己小的馬上交換,依次執行
2.選擇排序,相當於冒泡的修改一點,每次找出最大或者最小的數再交換。/** * 氣泡排序 * 每一次找出剩下最大的放在後面 *時間複雜度為O(n^2) */ for(int i=num.length-1; i>=0; i--){ for(int j=i-1; j>=0 ; j-- ){ /*找到比自己大的馬上交換*/ if(num[i]<num[j]){ int temp = num[i]; num[i] = num[j]; num[j] = temp; } } }
for(int i=num.length-1; i>=0; i--){ int max = i; for(int j=i-1; j>=0 ; j-- ){ /*發現有比自己大的數,記錄小這個數的位置*/ if(num[max]<num[j]){ max = j; } } /*一輪下來發現最大的數不是自己,就交換位置*/ if(i != max){ int temp = num[i]; num[i] = num[max]; num[max] = temp; } }