快速排序

快速排序:
以數組中最後一個數爲基準值,然後從數組的兩頭(即 數組下標爲0,和下標爲arrray.length-1處)分別開始遍歷數組,將小於基準值的數放在數組的左邊,將大於基準值的數放在數組的右邊,最後將基準值放在這兩部分中間,最後導致,基準值左邊的數都比基準值小,基準值右邊的數都比基準值大;然後從基準值處分爲左右兩部分,對左邊的那一部分數再進行快速排序,對右邊的那一部分數也再進行快速排序;遞歸循環。
比如:數組{1,3,8,2,0,11,6,7,21,9}, 以最右邊的數9爲基準值,經過一次快速排序,變爲:1,3,8,2,0,6,7,9,11,21;則基準值所在的下標變爲7,分爲兩部分,然後將{1,3,8,2,0,6,7}和{11,21}分別再進行快速排序,{1,3,8,2,0,6,7}以7爲基準值,{11,21}以21爲1基準值,分別進行快速排序;以此類推循環。

 private  static void quickSort(int[] array){
        quickSortInner(array,0,array.length-1);
    }
    private static void quickSortInner(int[] array,int left,int right){
    //當[left,right]之間只剩一個數或沒有數存在時,就結束了
        if(left==right){
            return;
        }
        if(left>right){
            return;
        }
        //先找出來基準值最終所在的位置
        //int splitVaule=partion1(array,left,right);
        //int splitVaule=partion2(array,left,right);
        int splitVaule=partion3(array,left,right);
        quickSortInner(array,left,splitVaule-1);
        quickSortInner(array,splitVaule+1,right);

    }

    //獲取基準值下標的方法 hover法
    private static int partion1(int[] array, int left, int right) {
        //以最右邊的數爲標準,將其它數與其相比較
        int vaule=array[right];
        int begin=left;
        int end=right;
        while(begin<end){
            while(begin<end&&array[begin]<=vaule){
                 begin++;
            }
            while(begin<end&&array[end]>=vaule){
                end--;
            }
            //當begin和end停止繼續時,說明不滿足左邊的比基準值小,右邊的比基準值大了
            //則將這兩個位置的數互換
            int t=array[begin];
            array[begin]=array[end];
            array[end]=t;
        }
         //將基準值換到begin這個位置
        int temp=array[begin];
        array[begin]=vaule;
        array[right]=temp;

        //返回基準值所在的下標
        return  begin;

    }

找出基準值所在的位置的方法還有:挖坑法、前後下邊法
挖坑法:
挖坑法與上面的hover法的不同之處就在於:將基準值保存下來,此處就相當於有一個坑,在進行遍歷時,每有不滿足條件的,就用那個不滿足條件的數來填坑,然後不滿足條件的數的位置處就變成了一個坑,等待另外一個不滿足條件的數來填坑,到最後循環結束時,就用基準值來填剩下的那個坑。

 //獲取基準值下標的方法 挖坑法
    private static int partion2(int[] array, int left, int right) {
        //以最右邊的數爲標準,將其它數與其相比較
        int vaule=array[right];
        int begin=left;
        int end=right;
        while(begin<end){
            while(begin<end&&array[begin]<=vaule){

                begin++;
            }
            array[end]=array[begin];
            while(begin<end&&array[end]>=vaule){

                end--;
            }
            array[begin]=array[end];

        }
        //將基準值換到begin這個位置
        array[begin]=vaule;

        //返回基準值所在的下標
        return  begin;


    }

前後下標法:


    //獲取基準值下標的方法 前後下標法
    //0~d之間是小於基準值的,d~i之間是大於基準值的
    //將最右邊的數作爲基準值
    private static int partion3(int[] array, int left, int right) {
        int d=left;
        for(int i=left;i<right;i++){
            if(array[i]<array[right]){

                //就將這個數移到array[d]的前面,就保證了下標d前面的數都是小於array[right]的
                //即 將array[i]與array[d]互換位置
                int t=array[d];
                array[d]=array[i];
                array[i]=t;

                //array[d]的位置也後移一位
                d++;
            }

        }

        //最後將array[right]與array[d]換一下位置
        int temp=array[d];
        array[d]=array[right];
        array[right]=temp;

       return  d;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章