2.快速排序

2.快速排序


前言

快速排序可以說是所有排序算法裏最常用、最優秀、最效率的算法。它是冒泡排序的改進版。就像它的名字一樣,“快速”!


實現思路

實現思路是非常有趣的:
- 1.先一個基準數(一般選擇第一個數。即,index = 0)。
- 2.來個while,從數組最右邊開始找比基準數小的數,記錄下標爲 r。
- 3.在再來個while,從數組最左邊開始找比基準數大的數,記錄下邊爲l。
- 4.交換兩個數的位置。即下標 r 和下標 l 的數交換。
- 5.當找到r == l 的時候。即,相遇的時候,第一次排序已經完成。此時,必然走到數組的中間的數。
- 6.基準數(index = 0)和 中間數交換。
- 7.此時原來的基準數到了中間,根據原來的基準數切分爲兩個數組(都不包含原基準素)。
- 8.分別給兩個數組做 上訴 1-7 的操作(開始遞歸)。


實現代碼

    public <T extends Comparable<T>> void quickSorting(T[] array, int left, int right) {
        int r, l;
        if (left > right) return;
        // 基準數
        T temp = array[left];
        l = left;
        r = right;
        while (l != r) {
            /**
             * 要先從右往左找
             * 如果比基準數大,就一直找下去,直到找到比基準數小的
             */
            while ((array[r].compareTo(temp) >= 0) && l < r) r--;
            /**
             * 要先從左往右找
             * 如果比基準數小,就一直找下去,直到找到比基準數大的
             */
            while ((array[l].compareTo(temp) <= 0) && l < r) l++;
            if (l < r) {
                /**
                 * 交換
                 */
                T t = array[l];
                array[l] = array[r];
                array[r] = t;
            }
        }
        /**
         * 基準數與中間位置的數字交換
         */
        array[left] = array[l];
        array[l] = temp;
        /**
         * 繼續處理左邊的,這裏是一個遞歸的過程
         */
        quickSorting(array, left, l - 1);
        /**
         * 繼續處理右邊的,這裏是一個遞歸的過程
         */
        quickSorting(array, l + 1, right);
    }

運行

    public static void main(String args[]) {
        Integer[] object = {26, 19, 7, 37, 27, 57, 67, 99, 87, 17};
        QuickSort quickSorting = new QuickSort();
        quickSorting.quickSorting(object, 0, object.length - 1);
        System.out.println("\n快速排序\n");
        for (int i : object) {
            System.out.print(i + " ");
        }
    } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章