數據結構與算法-快速排序

 以下代碼是作者本人,在idea裏驗證過的,核心代碼主要就是原地完成排序並獲取中間值的下標,有兩種方法來實現請參考ge tMid()與getMid2()兩個方法,第一種方法更容易理解,但不優雅,第二種理解起來困難些,但是代碼看起來更優雅。

快速排序是時間複雜度是O(nlogn),空間複雜度O(1),但是不是穩定的排序算法。

相同的元素在使用快速排序後原來的循環可能會發生改變。

 /**
     * 快速排序
     * @param arr 數組
     * @param left 數組左下標
     * @param right 數組右下標
     */
    private static void quickSort(Integer[] arr, int left, int right){
        if (left >= right) {
            return;
        }
        // 排序並獲取中間值(基準值)的下標
//        int mid = getMid(arr, left, right);
        int mid = getMid2(arr, left, right);
        // 遞歸排序左邊的區間,注意:最後一位參數不能寫成mid,否則會死循環
        quickSort(arr, left, mid - 1);
        // 遞歸排序右邊的區間,中間的參數不能寫爲mid,否則會死循環
        quickSort(arr, mid + 1, right);

    }

    /**
     * 查到基準下標(此過程中涉及重新排序)
     * @param arr 數組
     * @param left 數組左下標
     * @param right 數組右下標
     * @return 中值下標
     */
    private static int getMid(Integer[] arr, int left, int right) {
        int base = arr[left];
        while (left < right){
            // 從最右邊開始查找小於基準點點值,如沒有就將最右邊的下標減1
            // (注意:判斷條件必須是包含等於,否吃會死循環,因此快速排序不能保證兩個等值的元素,排完循序後還保持原有循序,不是穩定的排序算法)
            while (left < right && arr[right] >= base) {
                right--;
            }
            // 找到小於基準點點值後交換
            arr[left] = arr[right];
            // 從左邊開始查找大於基準值的元素,沒有就將下標加1
            while (left < right && arr[left] <= base){
                left++;
            }
            // 找到大於基準點的值後交換
            arr[right] = arr[left];
        }
        // 最後將原來的基準值填充回來,此時的left就是基準值的下標(注意:left經過++操作已經不是原來的下標值了)
        arr[left] = base;
        return left;
    }


    /**
     * 巧妙使用數組下標排序並獲取中間值(基準值)下標
     * @param arr 數組
     * @param left 左下標
     * @param right 右下標
     * @return 中值下標
     */
    private static int getMid2(Integer[] arr, int left, int right){
        int i = left;
        int pivot = arr[right];
        for (int j = left; j < right; j++) {
            if (arr[j] < pivot) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                i++;
            }
        }
        int temp = arr[i];
        arr[i] = arr[right];
        arr[right] = temp;
        return i;
    }

 

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