1. 程式人生 > >快速排序是常考和找工作經常被問到的排序方式,需要重要掌握

快速排序是常考和找工作經常被問到的排序方式,需要重要掌握

package eighty;

public class Kuaisupaixu {
     public static void main(String[] args) {
         //快速排序,將長度為N的無重複陣列排序,快速排序平均需要——2NlgN次比較(以及1/6的交換)。快速排序最多需要N2/2次比較,但隨機打亂陣列能夠預防這種情況
         int[] a = {33,21,51,54,1,45,12,654,90};
         sort(a);
         for(int i = 0 ; i < a.length ; i ++) {
             System.out.print(a[i]+" ");
         }
     }
    private static void sort(int[] a) {
        // TODO Auto-generated method stub
        sort(a,0,a.length-1);
    }
    private static void sort(int[] a, int lo, int hi) {
        // TODO Auto-generated method stub
        if( hi <= lo )  return;              //當上界小於等於下界時,就可以跳出迴圈了
        int k = partion(a , lo , hi);         //以首元素為界,把它放在應在的位置k,並把小於此元素的元素放在k位置的前面,大於此元素的放在k的位置的後面
        sort(a,lo,k-1);                      //利用遞迴,k元素的前一部分進行快速排序
        sort(a,k+1,hi);                      //利用遞迴,k元素的後一部分進行快速排序
    }
    private static int partion(int[] a, int lo, int hi) {
        // TODO Auto-generated method stub
        int i = lo ;
        int j = hi +1;
        int v = a[lo];
        while(true) { 
            while( less(a[++i],v) ) if( i == hi )  break;
            while( less(v,a[--j]))  if( j == lo)   break;
            if(i >= j) break;                    //利用判斷進行跳出迴圈而不是利用while(i <=j )是因為迴圈條件是要整個迴圈體執行完再判斷,
            exchange(a,i,j);                     //此時可能已經發生了一次違規的交換
        }
        exchange(a,lo,j);                        //此時進行最後一次交換,就是把k元素放到應該放在的位置
        return j;
    }
    private static boolean less(int i, int v) {
        // TODO Auto-generated method stub
        if((i-v)<0)
                return true;
        else 
            return false;
    }
    private static void exchange(int[] a, int i, int j) {
        // TODO Auto-generated method stub
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    
    
    
    
}