精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

排序算法:詳解快速排序

開發 前端
快速排序是一種高效的分治排序算法,由Tony Hoare在1960年提出。它的核心思想是"分而治之",通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,然后分別對這兩部分記錄繼續進行排序,以達到整個序列有序。

快速排序介紹

快速排序是一種高效的分治排序算法,由Tony Hoare在1960年提出。它的核心思想是"分而治之",通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,然后分別對這兩部分記錄繼續進行排序,以達到整個序列有序。

快速排序實現

一、工作原理

原始數組: [10, 7, 8, 9, 1, 5]
步驟1: 選擇基準元素(這里選擇最后一個元素5)
步驟2: 分區操作,將小于5的放在左邊,大于5的放在右邊
        [1, 5, 8, 9, 10, 7]  // 5已經在正確位置
步驟3: 遞歸排序左半部分[1]和右半部分[8, 9, 10, 7]
       左半部分[1]已經有序
       右半部分選擇基準7 → [7, 9, 10, 8] → 繼續遞歸...

二、分區過程詳解

分區是快速排序的核心操作,以最后一個元素為基準:

數組: [10, 80, 30, 90, 40, 50, 70]
基準: 70


分區過程:
i = -1, j = 0: 10 < 70 → 交換arr[++i]和arr[j] → [10, 80, 30, 90, 40, 50, 70]
i = 0,  j = 1: 80 > 70 → 不交換
i = 0,  j = 2: 30 < 70 → 交換 → [10, 30, 80, 90, 40, 50, 70]
i = 1,  j = 3: 90 > 70 → 不交換
i = 1,  j = 4: 40 < 70 → 交換 → [10, 30, 40, 90, 80, 50, 70]
i = 2,  j = 5: 50 < 70 → 交換 → [10, 30, 40, 50, 80, 90, 70]
最后交換基準: 交換arr[i+1]和arr[high] → [10, 30, 40, 50, 70, 90, 80]
基準70已經在正確位置!

算法特點

圖片圖片

代碼實現

一、基礎版(Lomuto分區方案)

public class QuickSortBasic {


    /**
     * 快速排序主方法
     */
    public static void quickSort(int[] arr) {
        if (arr == null || arr.length <= 1) {
            return;
        }
        quickSort(arr, 0, arr.length - 1);
    }


    /**
     * 遞歸快速排序
     * @param arr 待排序數組
     * @param low 起始索引
     * @param high 結束索引
     */
    private static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            // 分區操作,獲取基準元素的正確位置
            int pivotIndex = partition(arr, low, high);


            System.out.println("基準元素 " + arr[pivotIndex] + " 已就位,數組狀態: " 
                             + arrayToString(arr, low, high));


            // 遞歸排序左半部分
            quickSort(arr, low, pivotIndex - 1);
            // 遞歸排序右半部分
            quickSort(arr, pivotIndex + 1, high);
        }
    }


    /**
     * Lomuto分區方案
     * @return 基準元素的最終位置
     */
    private static int partition(int[] arr, int low, int high) {
        // 選擇最后一個元素作為基準
        int pivot = arr[high];
        System.out.println("分區: [" + low + "-" + high + "], 基準: " + pivot);


        // i指向小于基準的區域的邊界
        int i = low - 1;


        for (int j = low; j < high; j++) {
            // 如果當前元素小于或等于基準
            if (arr[j] <= pivot) {
                i++;
                swap(arr, i, j);


                if (i != j) {
                    System.out.println("  交換 " + arr[j] + " 和 " + arr[i] + 
                                     " → " + arrayToString(arr, low, high));
                }
            }
        }


        // 將基準元素放到正確位置
        swap(arr, i + 1, high);
        System.out.println("  基準就位: " + arrayToString(arr, low, high));


        return i + 1;
    }


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


    /**
     * 輔助方法:打印數組指定范圍
     */
    private static String arrayToString(int[] arr, int low, int high) {
        StringBuilder sb = new StringBuilder("[");
        for (int i = low; i <= high; i++) {
            sb.append(arr[i]);
            if (i < high) sb.append(", ");
        }
        sb.append("]");
        return sb.toString();
    }


    public static void main(String[] args) {
        int[] arr = {10, 7, 8, 9, 1, 5};
        System.out.println("原始數組: " + java.util.Arrays.toString(arr));
        System.out.println("開始快速排序:");


        quickSort(arr);


        System.out.println("排序結果: " + java.util.Arrays.toString(arr));
    }
}

二、優化版(Hoare分區方案+三數取中)

public class OptimizedQuickSort {


    /**
     * 優化版快速排序
     * 優化點1: 使用Hoare分區方案,減少交換次數
     * 優化點2: 三數取中法選擇基準,避免最壞情況
     * 優化點3: 小數組使用插入排序
     */
    public static void quickSortOptimized(int[] arr) {
        if (arr == null || arr.length <= 1) return;
        quickSortOptimized(arr, 0, arr.length - 1);
    }


    private static void quickSortOptimized(int[] arr, int low, int high) {
        // 小數組使用插入排序
        if (high - low + 1 <= 10) {
            insertionSort(arr, low, high);
            return;
        }


        if (low < high) {
            // 選擇基準并分區
            int pivotIndex = hoarePartition(arr, low, high);


            // 遞歸排序
            quickSortOptimized(arr, low, pivotIndex);
            quickSortOptimized(arr, pivotIndex + 1, high);
        }
    }


    /**
     * Hoare分區方案 - 更高效的分區方法
     */
    private static int hoarePartition(int[] arr, int low, int high) {
        // 三數取中法選擇基準
        int pivot = medianOfThree(arr, low, high);
        int i = low - 1;
        int j = high + 1;


        while (true) {
            // 從左向右找到第一個大于等于基準的元素
            do {
                i++;
            } while (arr[i] < pivot);


            // 從右向左找到第一個小于等于基準的元素
            do {
                j--;
            } while (arr[j] > pivot);


            // 如果指針相遇,返回分區位置
            if (i >= j) {
                return j;
            }


            // 交換元素
            swap(arr, i, j);
        }
    }


    /**
     * 三數取中法:選擇左、中、右三個數的中值作為基準
     */
    private static int medianOfThree(int[] arr, int low, int high) {
        int mid = low + (high - low) / 2;


        // 對三個數進行排序
        if (arr[low] > arr[mid]) swap(arr, low, mid);
        if (arr[low] > arr[high]) swap(arr, low, high);
        if (arr[mid] > arr[high]) swap(arr, mid, high);


        // 將中值放在high-1位置,返回中值作為基準
        swap(arr, mid, high);
        return arr[high];
    }


    /**
     * 插入排序,用于小數組
     */
    private static void insertionSort(int[] arr, int low, int high) {
        for (int i = low + 1; i <= high; i++) {
            int key = arr[i];
            int j = i - 1;


            while (j >= low && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key;
        }
    }


    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }


    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90, 5, 77, 30, 15, 42};
        System.out.println("原始數組: " + java.util.Arrays.toString(arr));


        quickSortOptimized(arr);


        System.out.println("排序結果: " + java.util.Arrays.toString(arr));
    }
}

使用建議

  1. 推薦使用:大規模數據排序、通用排序需求
  2. 避免使用:需要穩定排序的場景、對最壞性能要求嚴格的場景
  3. 優化重點:合理的基準選擇、處理小數組、避免最壞情況

快速排序以其優異的平均性能和緩存友好性,成為實際應用中最常用的排序算法之一!

責任編輯:武曉燕 來源: 小林聊編程
相關推薦

2011-04-20 15:20:03

快速排序

2021-01-26 05:33:07

排序算法快速

2014-10-30 15:14:54

快速排序編程算法

2021-03-04 07:24:28

排序算法優化

2017-11-22 14:20:07

前端JavaScript排序算法

2023-05-08 07:55:05

快速排序Go 語言

2014-03-03 16:44:57

算法

2023-03-07 08:02:07

數據結構算法數列

2021-01-21 05:22:36

排序算法選擇

2014-10-30 15:08:21

快速排序編程算法

2009-08-25 17:41:51

C#開發排序算法

2023-10-05 09:01:05

插入排序對象序列log2i

2010-01-11 15:01:55

VB.NET冒泡排序

2021-01-19 07:02:26

算法數據結構堆排序

2011-04-20 15:06:44

堆排序

2011-04-20 14:07:37

冒泡排序

2011-04-20 13:56:08

選擇排序

2011-04-20 14:19:00

希爾排序

2022-03-07 09:42:21

Go快速排序

2023-03-06 08:10:52

數據結構算法數據
點贊
收藏

51CTO技術棧公眾號

北岛玲一区二区三区四区| 青青久久av| 一区二区三区四区在线免费观看 | 欧美黄片一区二区三区| 成人看片爽爽爽| 在线亚洲免费视频| 在线观看18视频网站| 后进极品白嫩翘臀在线视频| 日本欧美一区二区在线观看| 欧美精品一区三区| 手机av免费看| 国产欧美88| 日本高清不卡一区| 狠狠噜天天噜日日噜| www.中文字幕久久久| 国产寡妇亲子伦一区二区| 国产成人综合一区二区三区| 久久网一区二区| 成人91在线| 亚洲精品乱码久久久久久按摩观| 国产又大又黄又猛| av免费不卡国产观看| 国产精品短视频| 久久综合婷婷综合| 不卡视频在线播放| 美女视频网站久久| 欧美孕妇与黑人孕交| 欧美国产日韩综合| 国产大片一区| 在线成人中文字幕| 色噜噜在线观看| www.久久东京| 日韩一区二区三区视频| 污色网站在线观看| 亚洲成人人体| 欧美日韩另类在线| 日本熟妇人妻xxxx| 影院在线观看全集免费观看| 中文无字幕一区二区三区| 精品国产综合区久久久久久| www.久久久久久| 国内精品伊人久久久久av影院 | 国产 日韩 欧美| 欧美揉bbbbb揉bbbbb| 国产男女激情视频| 台湾佬成人网| 91国产免费观看| 成年人网站大全| 欧美无毛视频| 色狠狠一区二区| 99视频在线免费| 国产精品字幕| 欧美日韩国产影片| 欧美日韩一区二区三区69堂| 精品福利在线| 欧美久久久久中文字幕| 久久成年人网站| 国产精品欧美一区二区三区不卡 | 艳妇乳肉亭妇荡乳av| 伊人亚洲福利一区二区三区| 成人福利视频网站| 日本高清精品| 99久久免费国产精精品| 天天综合网日韩| 国产精品v欧美精品∨日韩| 精品久久中文字幕久久av| 日韩在线观看免费高清| 精品人妻一区二区三区四区| 国产欧美日韩一区二区三区四区 | 日本一二区免费| 亚洲美女色播| 日韩免费视频一区| 精品人妻一区二区三区日产| 免费黄色成人| 中文字幕亚洲一区二区三区五十路 | 91丨九色丨蝌蚪丨老版| 欧美日韩在线观看一区二区三区| 成年在线电影| 亚洲精品一二三| 狠狠干 狠狠操| av免费在线一区| 91精品国产综合久久久久久久 | 91av在线免费观看| 日本黄色中文字幕| 久久爱另类一区二区小说| 动漫美女被爆操久久久| 欧美孕妇性xxxⅹ精品hd| 国产精品三级电影| 黄色激情在线视频| 成人四虎影院| 欧美tickling网站挠脚心| 中文字幕一二三四区| 日韩久久久久| 高清欧美性猛交| 最近中文字幕在线免费观看| 成人综合在线视频| 亚洲精品国产精品国自产观看| av免费看在线| 91国模大尺度私拍在线视频| 亚洲av无一区二区三区久久| 久久综合色占| 欧美床上激情在线观看| 丰满人妻老熟妇伦人精品| 国模娜娜一区二区三区| 欧美福利精品| 精灵使的剑舞无删减版在线观看| 色婷婷av一区二区三区大白胸| 国产精品久久久久野外| av一区二区在线播放| 久久久欧美一区二区| 怡红院成永久免费人全部视频| 成人高清在线视频| 日本一道在线观看| 日本成人片在线| 亚洲国产精品久久久久秋霞蜜臀| 亚洲人做受高潮| 爽爽淫人综合网网站| 国产精品久久久久久久久久久久冷| 91在线网址| 欧美丝袜第一区| 最新日本中文字幕| 一区二区三区四区在线观看国产日韩| 国产精品久久久| 亚洲 美腿 欧美 偷拍| 18欧美亚洲精品| 亚洲欧美自拍另类日韩| 你微笑时很美电视剧整集高清不卡| 欧美黄色片在线观看| 一卡二卡三卡在线观看| 国产人成亚洲第一网站在线播放| a级黄色一级片| 视频二区欧美毛片免费观看| 久久精品视频免费播放| 亚洲天堂aaa| 国产精品久久久久一区| 91视频免费版污| 美日韩中文字幕| 日韩av大片免费看| 噜噜噜噜噜在线视频| 欧美日韩国产一区二区| 亚洲激情 欧美| 在线观看视频免费一区二区三区| 97在线资源站| 激情网站在线| 精品国一区二区三区| 久久久美女视频| 国产成人精品三级| 精品免费久久久久久久| 美女国产精品久久久| 欧美不卡视频一区发布| 国产激情久久久久久熟女老人av| 亚洲日本电影在线| 三级网站免费看| 欧美日韩三级| 国产一区二区三区av在线| 日本黄色免费在线| 亚洲欧美一区二区三区四区| 亚洲视频 欧美视频| 国产拍欧美日韩视频二区| av动漫免费看| 日韩88av| 亚洲a在线观看| 欧美日韩经典丝袜| 日韩精品免费在线视频| 天天干天天操天天爱| 国产女人水真多18毛片18精品视频| 99草草国产熟女视频在线| 成人羞羞视频播放网站| 91精品综合久久久久久五月天| 高清全集视频免费在线| 精品日韩在线观看| 亚洲欧美精品一区二区三区| 欧美国产一区视频在线观看| 三级一区二区三区| 国模吧视频一区| 免费一区二区三区在在线视频| 韩国精品主播一区二区在线观看| 久久激情视频免费观看| 日本激情视频网站| 色婷婷av久久久久久久| 疯狂撞击丝袜人妻| 不卡的av网站| 性刺激的欧美三级视频| 欧美黄色aaaa| 区一区二区三区中文字幕| 午夜精品久久久久久毛片| 久久久久久91| 黄色的视频在线免费观看| 日韩午夜av一区| 国产农村妇女aaaaa视频| 自拍偷拍国产精品| 黄色录像a级片| 精品亚洲免费视频| 黄色片视频在线免费观看| 亚洲高清资源在线观看| 精品在线不卡| 99精品视频在线免费播放| 欧洲日本亚洲国产区| 菠萝菠萝蜜在线视频免费观看| 亚洲美女久久久| 国产精品玖玖玖| 色网站国产精品| 国产在线视频二区| 国产精品久久免费看| 国产精品300页| 国产一区二区导航在线播放| 日韩av一二三四| 亚洲区国产区| 日本黄网站色大片免费观看| 日本欧美视频| 玛丽玛丽电影原版免费观看1977| 精品一区二区三区中文字幕视频| 日韩av观看网址| 搞黄网站在线看| 久久国产精品久久国产精品| 黑人与亚洲人色ⅹvideos| 欧美精品一区二区三区久久久| 国产精品国产三级国产aⅴ | 国产精品久久久午夜夜伦鲁鲁| 欧美日韩午夜视频在线观看| 久久精品第一页| 综合电影一区二区三区| 国产一二三四区在线| 久久伊人中文字幕| 欧美大喷水吹潮合集在线观看| 国产精品影音先锋| 污污视频网站在线| 美腿丝袜亚洲综合| 美女一区二区三区视频| 久久久久久自在自线| 成年人黄色片视频| 国产一区成人| 69堂免费视频| 夜夜精品视频| 又粗又黑又大的吊av| 亚洲精品美女91| av免费观看国产| 亚洲久久一区二区| 成 年 人 黄 色 大 片大 全| 国内揄拍国内精品久久| 欧美一级中文字幕| 欧美视频网站| 成人午夜视频免费观看| 欧美日韩视频一区二区三区| 青青草综合在线| 1024日韩| 99爱视频在线| 天堂在线亚洲视频| 国产wwwxx| 麻豆91精品视频| 亚洲欧美日本一区二区三区| 激情小说亚洲一区| 亚洲av无一区二区三区久久| 成人性色生活片| 亚洲精品理论片| 欧美国产欧美亚州国产日韩mv天天看完整 | 日韩亚洲第一页| www免费视频观看在线| 欧美日韩成人黄色| 激情aⅴ欧美一区二区欲海潮| 91福利视频在线观看| 日韩精品一区二区三区| 国产精品一香蕉国产线看观看| 亚洲男人在线| 国产精品手机视频| 精品一区在线| 伊人久久大香线蕉综合75| 亚洲欧美色图| 国产人妻777人伦精品hd| 久久99伊人| 欧美成人福利在线观看| 国产精品一区二区三区99| 挪威xxxx性hd极品| 久久久国产精品麻豆| 午夜国产福利视频| 亚洲福利一区二区三区| 午夜婷婷在线观看| 91精品婷婷国产综合久久竹菊| 亚洲国产精品久久人人爱潘金莲 | 欧美精品一区三区在线观看| 日韩在线中文| 免费一级淫片aaa片毛片a级| 日韩在线观看一区二区| 色黄视频免费看| 久久综合九色综合欧美亚洲| 开心激情五月网| 婷婷综合五月天| 中文字幕有码视频| 亚洲成人精品视频在线观看| 超碰免费在线| 久久久久国产精品一区| 99久久婷婷国产综合精品首页| 91成人理论电影| 国产一区2区| 国产www免费| 久久国产精品色婷婷| 欧美做受喷浆在线观看| 亚洲女性喷水在线观看一区| 午夜精品一区二| 欧美精品一区二区蜜臀亚洲| 免费网站成人| 98视频在线噜噜噜国产| 国产亚洲字幕| 午夜精品电影在线观看| 亚洲精品精选| 精品国产乱码久久久久久1区二区| 91丨九色丨蝌蚪丨老版| 国产亚洲精品久久久久久无几年桃 | 亚洲影视在线播放| 伊人色综合久久久| 亚洲男人av电影| 国产桃色电影在线播放| 成人网址在线观看| 成人区精品一区二区婷婷| 亚洲 欧美 综合 另类 中字| 狠狠狠色丁香婷婷综合久久五月| 色哟哟精品观看| 欧美日韩国产丝袜另类| 精品国产亚洲av麻豆| 色妞欧美日韩在线| 美女网站视频一区| 久久久久久精| 一本久久知道综合久久| 无码人妻一区二区三区免费n鬼沢 久久久无码人妻精品无码 | 日本高清不卡在线观看| 天堂av在线免费观看| 久久久久久九九九| 欧美专区一区| 日本一道在线观看| 国产福利一区二区三区| 天天看片中文字幕| 在线播放中文字幕一区| av大片在线播放| 国产精品旅馆在线| 日韩欧美视频专区| mm131亚洲精品| 国产精品久久久久影院色老大| 中文字幕一区二区人妻痴汉电车| 一本一本久久a久久精品牛牛影视 一本色道久久综合亚洲精品小说 一本色道久久综合狠狠躁篇怎么玩 | 亚洲精品日韩av| 91精品国产乱码久久久久久| 中文字幕免费高清在线| 椎名由奈av一区二区三区| 97精品人妻一区二区三区| 久久亚洲一区二区三区四区五区高| 亚洲伦理一区二区| 粉嫩av一区二区三区天美传媒 | 日韩制服一区| 亚洲欧美日韩国产yyy| 久久99热国产| 五月天婷婷色综合| 欧美成va人片在线观看| av资源中文在线| 欧美高清视频一区二区三区在线观看 | 久久蜜桃av一区精品变态类天堂| 中文在线第一页| 中文字幕精品一区久久久久| 综合欧美精品| 国产精品无码免费专区午夜| 不卡的av网站| 亚洲欧美日韩激情| 日韩视频在线一区| baoyu135国产精品免费| 日韩av片在线看| 中文字幕欧美三区| 国产美女明星三级做爰| 久久99热这里只有精品国产 | 亚洲亚洲精品三区日韩精品在线视频| 久久国内精品视频| 国产一级中文字幕| 亚洲欧洲激情在线| 日韩国产91| 久久av综合网| 国产免费观看久久| aaa一区二区三区| 欧洲午夜精品久久久| 国产精品99视频| 老司机午夜免费福利| 日本久久一区二区三区| 国产激情视频在线| 免费亚洲精品视频| 国产乱码字幕精品高清av| 999这里只有精品| 最近中文字幕mv在线一区二区三区四区 | 色大18成网站www在线观看| 444亚洲人体| 久久久久国产精品午夜一区| 日韩视频中文字幕在线观看| 亚洲精品视频免费在线观看| 疯狂欧洲av久久成人av电影| 欧美在线观看成人| 亚洲免费在线观看视频| 亚洲三级黄色片| 51国偷自产一区二区三区的来源| 久久精品动漫| 久久久久97国产| 在线视频日韩精品| 欧美理论电影在线精品| 在线一区二区不卡| 色婷婷国产精品|