快速排序詳細分析(Java實現)

 /**
     * 排序過程
     * 1,找一個基準數,找數組內的任意一個數都行,一般都是以數組第一個數爲基準數
     * 2,從數組末位向前循環找比基準數小的,找到了先停下,也就是記錄當前的索引
     *   從數組開端向後循環找比基準數大的,找到了先停下,也就是記錄當前的索引
     * 3,將第二步的兩個索引的位置的數值交換,這樣比基準數大的就到了基準數的後面, 比基準數小的就到了基準數的前面
     * 4,繼續不停的重複2,3步,直到兩個索引位置相等,就不用再交換了,也就是當start < end時就不停止循環
     * 5,start和end相等,停止循環,將start或end位置的數與基準數交換
     * 6,遞歸循環基準數左面的數組
     * 7,遞歸循環基準數右面的數組
     * @param arr
     * @param start
     * @param end
     *
     * 幾個問題,(把索引start和end當成指針來講)
     * start和end一定會相遇嗎,或者說start和end一定會相等嗎?
     *      答:一定會的,因爲start和end都是一步一步移動的,移動會發生重合
     * start和end相遇或者說重合或者說索引位置一樣,該位置的數一定是比基準數小的嗎?(該位置的數要和基準是交換)
     *      答:因爲是end先移動的,end指向的都是比比基準數小的數(start和end交換時)
     *      1當end發現比基準數小的數,start發現比基準數大的數,進行交換數據時,一定是成對出現的
     *      2當end往前移動與start相遇時,這個時候start和end已經交換了數據,start指向的就是比基準數小的數,
     *      3當start向後移動,end已經指向的是比基準數小的數,
     *      4綜上;當相遇時start和end位置上的數一定是比基準數小的數,所以可以和首位置上的基準數交換
     *      5出現“相遇時start和end位置上的數一定是比基準數小的數”這種情況是移動的先後順序引起的,如果是start
     *          先移動,則相遇時最後指向的是比基準數大的數。
     */ 


    public static void fastSort(int[] arr,int start,int end){
        if(null == arr || arr.length == 0 || start >= end)
            return;

        //將start 和 end記錄下來,是爲了進行左側和右側兩段的排序
        int left = start;
        int right = end;

        int key = arr[start];

        while (start < end){
            //從後往前循環,如果不是先從後往前循環,那麼排序結果是不正確的,爲什麼?

            while (start < end && arr[end] >= key) end--;

            //從前往後循環
            while (start < end && arr[start] <= key) start++;

            if(start < end) swap(arr,start,end);

        }
        //將基準數和start與end相等的位置的數交換位置,left位置就是最開端的數,是基準數
        //這個時候start和end是相等的,這裏用end也可以
        swap(arr,left,start);
        //基準數左側數組的排序
        fastSort(arr,left,start-1);
        //右側的排序
        fastSort(arr,start+1,right);

    }

    
    Hello World
    輸出:6,7,9,30,34,34,42,48,49,83,84,89,93,98,223,321,845,



public static void swap(int[] arr,int index1,int index2){
        int temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;

    }
public static void main(String args[]){
        System.out.println("Hello World");
        int[] arr = {30,6,89,83,42,9,34,84,98,93,845,321,34,7,223,48,49};
        fastSort(arr,0,arr.length-1);
//        swap(arr,0,2);
        printArr(arr);
    }

    private static void printArr(int[] arr) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i : arr) {
            stringBuilder.append(i).append(",");
        }
        System.out.println(stringBuilder.toString());
    }

 

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