排序-快速排序

思想

快速排序每一趟排序,都會尋找一個基準(zhǔn)元素,有的采用第一個元素,有的會隨機(jī)生成一個,但是基本思想是不變的,一趟排序結(jié)束,會形成以基準(zhǔn)元素為分界點的兩部分,其中左邊比基準(zhǔn)元素?。僭O(shè)從小到大排序),右邊比基準(zhǔn)元素大。然后再以相同的方法處理左邊和右邊兩部分,即遞歸。

快速排序

實現(xiàn)(java)

import com.jiajia.ArrayUtil.ArrayUtil;
/**
 * @ClassName: QucikSortMain
 * @Author: Numen_fan
 * @Date: 2019/3/6 下午9:02
 * @Version: 1.0
 * @Description: 快速排序
 */
public class QucikSortMain {

    public static void main(String[] args) {

        int[] arr = {4,2,35,9,7,8,1,5,0,4,3};
        quickSort(arr, 0, arr.length - 1);
        ArrayUtil.print(arr);
    }

    private static  void quickSort(int[] arr, int left, int right){

        if (left >= right) {    // 必須加
            return;
        }

        int temp = arr[left]; // 以左邊的元素為基準(zhǔn)元素
        int i = left, j = right; // i,j為兩個游標(biāo)
        while (i < j) {
            while (i < j && arr[j] >= temp){ // 右邊先走
                j--;
            }
            while (i < j && arr[i] <= temp) {
                i++;
            }
            if (i < j) {
                swap(arr, i, j);
            }
        }
        arr[left] = arr[i]; // 注意,這一步必須要,填上最左邊的坑
        arr[i] = temp; // 基準(zhǔn)元素就位
        quickSort(arr, left, i - 1);    // 遞歸操作左邊部分
        quickSort(arr, i + 1, right);   // 遞歸操作右邊部分
    }

    /**
     * 交換兩個元素
     * @param arr
     * @param i
     * @param j
     */
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

很多方法會寫成兩個函數(shù),一個用來返回一趟結(jié)束后基準(zhǔn)元素的位置,然后一個外圍函數(shù)用來遞歸,其實和這個類似,其實就是將后面兩個遞歸函數(shù)之前的部分封裝成一個函數(shù)而已!

參考資料

快速排序(過程圖解)
白話經(jīng)典算法系列之六 快速排序 快速搞定
值得收藏的十大經(jīng)典排序算法

最后

此致,敬禮

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容