1. 程式人生 > >快速排序 和 Dijkstra 3-way快排介紹

快速排序 和 Dijkstra 3-way快排介紹

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])。