快速排序 和 Dijkstra 3-way快排介紹
阿新 • • 發佈:2019-02-12
一、上面的程式碼中有很多地方需要注意到:public class quickSort { private static int partition(int[] a,int lo,int hi){ int i = lo,j = hi + 1; while(true){ // 找到比a[lo] 大的數 while( a[++i] < a[lo]) if( i==hi )break; // 找到比a[hi] 小的數 while( a[lo] <a[--j]) if( j== lo ) break; if (i >= j) break; //交換i,j 下標的值, //那麼就保證比a[lo] 小的被交換到左邊,大的交換到右邊 exch(a,i,j); } //最後結束時 //i一定指向比a[lo]大的數字或者最後一個數, //j一定指向比a[lo]小的數字或者最頭上的數,將小數與a[lo]交換 exch(a,lo,j); return j; } private static void sort(int[] a, int lo,int hi){ if( hi <= lo) return; int j = partition(a,lo,hi); sort(a,lo,j-1); sort(a,j+1,hi); } private static void exch(int[] a,int lo,int hi){ int tmp; tmp = a[lo]; a[lo] = a[hi]; a[hi] = tmp; } }
while( a[++i] < a[lo])
if( i==hi )break;
假如我這裡用的是 <= 號而不是 < 號快排演算法在一些情況下就退化成O(N^2) 了,下面是一些解釋。快速排序演算法在1962年被提出來,在1990年的時候C語言的使用者發現了系統提供的qsort(),當排序的陣列中含有大量的相同的關鍵字時,演算法退化成O(N^2)複雜度。錯誤的根源在於:把所有與軸的關鍵詞相同的項都放到了軸的一邊(軸,就是partion過程中作為基準的那一項,上面程式碼中的a[lo])。