快速排序---從大到小和從小到大(Java)

快速排序:

  快速排序由於排序效率在同爲O(nlogn)的幾種排序方法中效率較高,因此經常被採用,再加上快速排序使用了分治法的思想,算是基礎排序中比較高檔的一種排序了。

基本思想

1.先從數列中取出一個數作爲基準數,可以是第一個,也可是中間的或者最後的,但是第一步要把這個基準數與數組最後一位對換。
2.將比這個數大(小)的數全放到它的右邊,小於或等於(大於或等於)它的數全放到它的左邊。
3.對左右區間重複第二步,直到各區間只有一個數(遞歸定義)。

詳細圖示

在這裏插入圖片描述 

圖片來源於網絡

代碼展示

public class Quick {

    public static void main(String[] args) {

        Integer arrA[] = new Integer[] { 13, 1, 2, 43, 65, 23, 76, 77, 23, 11, 99 };
        Integer arrB[] = new Integer[] { 13, 1, 2, 43, 65, 23, 76, 77, 23, 11, 99 };
        Integer[] arr1 = quickSortBig2Small(arrA, 0, arrA.length - 1);
        System.out.println("從大到小:" + Arrays.toString(arr1));
        Integer[] arr2 = quickSortSmall2Big(arrB, 0, arrB.length - 1);
        System.out.println("從小到大:" + Arrays.toString(arr2));

    }

    /**
     * 快排從大到小
     */
    private static Integer[] quickSortBig2Small(Integer[] arr, int low, int high) {

        // 如果開始點和結束點沒有重疊的時候,也就是指針沒有執行到結尾
        if (low < high) {

            // 重新獲取中間點
            int mid = getIndexFromBig2Small(arr, low, high);
            quickSortBig2Small(arr, low, mid - 1);
            quickSortBig2Small(arr, mid + 1, high);
        }
        return arr;
    }

    /**
     * 快排從小到大
     */
    private static Integer[] quickSortSmall2Big(Integer[] arr, int low, int high) {

        // 如果開始點和結束點沒有重疊的時候,也就是指針沒有執行到結尾
        if (low < high) {

            // 重新獲取中間點
            int mid = getIndexFromSmall2Big(arr, low, high);
            quickSortSmall2Big(arr, low, mid - 1);
            quickSortSmall2Big(arr, mid + 1, high);
        }
        return arr;
    }

    /**
     * 交換數組元素
     */
    private static void swap(Integer[] arr, int low, int high) {

        int temp = arr[low];
        arr[low] = arr[high];
        arr[high] = temp;
    }

    /**
     * 獲取中間值(從大到小)
     */
    private static int getIndexFromBig2Small(Integer[] arr, int low, int high) {

        // 中值作爲中點
        int index = (low + high) / 2;

        int midNum = arr[index];

        // 無論取的值是哪一個,都應該將其放在最後面
        swap(arr, index, high);

        while (low < high) {

            // 左側值大於或者等於右側值時候,只需要移動指針即可,不需要交換( 注意 =,沒有會陷入死循環)
            while (low < high && arr[low] >= midNum)
                low++;
            swap(arr, low, high);

            // 右側值小於或者等於右側值時候,只需要移動指針即可,不需要交換
            while (low < high && arr[high] <= midNum)
                high--;
            swap(arr, low, high);
        }
        return high;
    }

    /**
     * 獲取中間值(從小到大)
     */
    private static int getIndexFromSmall2Big(Integer[] arr, int low, int high) {

        // 中值作爲中點
        int index = (low + high) / 2;

        int midNum = arr[index];

        // 無論取的值是哪一個,都應該將其放在最後面
        swap(arr, index, high);

        while (low < high) {

            // 左側值小於或者等於右側值時候,只需要移動指針即可,不需要交換( 注意 =,沒有會陷入死循環)
            while (low < high && arr[low] <= midNum)
                low++;
            swap(arr, low, high);

            // 右側值小大於於或者等於右側值時候,只需要移動指針即可,不需要交換
            while (low < high && arr[high] >= midNum)
                high--;
            swap(arr, low, high);
        }
        return high;
    }

}

運行圖示

在這裏插入圖片描述

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