1. 程式人生 > >Java 快速排序 看著一片就夠了

Java 快速排序 看著一片就夠了

樓主在複習快速排序的時候發現了很多問題,其中也參照了大神的程式碼,進行了程式碼的詳細說明

大神程式碼地址,有很好的圖例說明 請點選

  • 我的程式碼實現
package sort;

public class QuickSort {

    /**
     * 快速排序
     * <p>
     * 從數列中挑出一個元素,稱為“基準”
     * 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。
     * 在這個分割之後,該基準是它的最後位置。這個稱為分割(partition)操作。
     * 遞迴地把小於基準值元素的子數列和大於基準值元素的子數列排序。
     *
     * @param arr  陣列
     * @param low  開始
     * @param high 結束
     */


    public static void quickSortRightMax(int[] arr, int low, int high) {
        if (low > high) {
            return;
        }
        int i = low;
        int j = high;
        int key = arr[i];
        int temp = 0;
        while (i < j) {
            while ((arr[j] >= key) && (j > i)) {
            /*從後往前比較
                如果沒有比關鍵key小的,比較下一個,直到找到比關鍵key小的
            */
                j--;
            }


            while ((arr[i] <= key) && (j > i)) {
            /*從往前往後比較
                如果沒有比關鍵key大的,比較下一個,直到找到比關鍵key大的
            */
                i++;
            }

            if (i < j) {
                //找到了比關鍵key大的值,和比Key小的值,調換位置
                temp = arr[j];
                arr[j] = arr[i];
                arr[i] = temp;
            }

        }
        // 此時哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到key面前。
        // 說明此時“探測”結束。我們將基準數arr[low]也就是Key所代表的值和arr[i]進行交換。
        arr[low] = arr[i];
        arr[i] = key;

        // 交換完了之後,就是以基準Key分成了2部分,左邊是小於key的,右邊是大於key的
        // 比如: int arr2[] = new int[]{6,1,2,7,9,3,4,5,10,8};
        // 現在變成了 3,1,2,5,4,6,9,7,10,8左邊是3,1,2,5,4 右邊是9,7,10,8
        // 接下來還需要分別處理這兩個序列。
        // 左邊的序列是“3 1 2 5 4”。
        // 請將這個序列以3為基準數進行調整,使得3左邊的數都小於等於3,3右邊的數都大於等於3。

        System.out.println(i == j);
        System.out.println("===============");
        //遞迴呼叫左半陣列,因為此時i=j,所以用i j都行
        quickSortRightMax(arr, low, j - 1);
        //遞迴呼叫左半陣列
        quickSortRightMax(arr, j + 1, high);
    }


    public static void main(String[] args) {
        int arr2[] = new int[]{6, 1, 2, 7, 9, 3, 4, 5, 10, 8, 11};
        quickSortRightMax(arr2, 0, arr2.length - 1);
        System.out.println("------------");
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }
    }


}

  • 注意事項

這裡比較的時候不管是《= 還是》= 都要帶=號,因為我們要找的是比它小的,或者大的 ((arr[i] <= key) && (j > i)) 還有明明外邊已經有i< j了為什麼裡面還要有?這是必須的,因為裡面在做++ 和——運算

  • 時間和空間複雜度

排序演算法