【常用算法:排序篇】2.快速排序的算法精要

快速排序是算法領域的"九陽神功",掌握其精髓能讓你在算法修煉之路上突破瓶頸。

1. 快速排序的核心思想

快速排序(Quicksort)是一種基于分治思想的高效排序算法,核心步驟為:

  1. 選擇基準值(Pivot):通常選擇待排序區間的第一個元素(也可隨機選或取中間值)。 [元素≤pivot] + [pivot] + [元素>pivot]
  2. Partition(分割)操作
    • 將數組分為兩部分,使得基準值左側元素均 ≤ 基準值,右側元素均 ≥ 基準值。
    • 實現方法:通過交替從右向左、從左向右掃描,交換不符合條件的元素,最終確定基準值的正確位置。
  3. 遞歸處理子數組:對基準值左右兩側的子數組重復上述步驟,直到所有元素有序。

2. Partition操作的關鍵細節

  • 空位交替填充:選擇基準值后,其初始位置視為“空位”,通過交替從后向前掃描小元素、從前向后掃描大元素,將元素填入空位,最終確定基準值的位置。
  • 時間復雜度:單次 Partition 操作的時間復雜度為 O(n),需遍歷整個子數組。

示例
原始數組 [8, 6, 3, 10, 9, 7, 2, 12],選擇 8 為基準值:

  1. 從右向左找到 2 < 8,將其填入空位 → [2, 6, 3, 10, 9, 7, _, 12]
  2. 從左向右找到 10 > 8,將其填入空位 → [2, 6, 3, _, 9, 7, 10, 12]
  3. 重復直至基準值位置確定 → [2, 6, 3, 7, 9, 8, 10, 12]

3.兩種經典實現方式

1. Lomuto分區(直觀易實現):

  • 以最后一個元素為基準
  • 雙指針維護分割點
    def partition(arr, low, high):pivot = arr[high]i = low  # 分割點for j in range(low, high):if arr[j] <= pivot:arr[i], arr[j] = arr[j], arr[i]i += 1arr[i], arr[high] = arr[high], arr[i]return i
    

2. Hoare分區(更高效):

  • 使用首元素為基準
  • 雙指針從兩端向中間掃描
    def partition(arr, low, high):pivot = arr[low]left, right = low+1, highwhile True:while left <= right and arr[left] <= pivot: left += 1while left <= right and arr[right] >= pivot: right -= 1if left > right: breakarr[left], arr[right] = arr[right], arr[left]arr[low], arr[right] = arr[right], arr[low]return right
    

4. 時間復雜度分析

快速排序的性能高度依賴基準值的選擇:

  • 最好情況:每次基準值均接近中位數,遞歸樹高度為 log?n,時間復雜度為 O(n log n)
  • 最壞情況:基準值始終為極值(如最大值或最小值),遞歸退化為鏈表,時間復雜度為 O(n2)
  • 平均情況:隨機選擇基準值時,時間復雜度接近 O(n log n)

類比二叉樹

  • 每次 Partition 將數組分為左右子樹,遞歸深度對應樹的高度。
  • 樹越平衡(層數少),效率越高;樹越不平衡(層數多),效率越低。

5. 快速排序的優化與應用

  • 工程優化:混合排序策略(如 C++ STL 的 sort 函數結合快速排序、插入排序和堆排序)。
  • 尾遞歸優化
def quick_sort(arr, low, high):while low < high:pi = partition(arr, low, high)quick_sort(arr, low, pi-1)low = pi + 1  # 減少遞歸深度
  • 三路快排
    • 處理大量重復元素:劃分為 <pivot、=pivot、>pivot 三部分
  • 實際應用
    • 2-sum 問題:先排序再使用雙指針法高效求解。
    • 快速選擇算法(QuickSelect):基于 Partition 操作,在 O(n) 時間內找到第 k 小元素(下節課重點)。

6. 學習要點與誤區

  • 關鍵思維:理解 Partition 操作是掌握快速排序的核心。
  • 常見誤區
    • 忽視基準值選擇對性能的影響。
    • 混淆 Partition 實現細節(如掃描順序、交換條件)。
  • 實踐建議
    • 手動模擬 Partition 過程(如紙上畫圖)。
    • 嘗試編碼實現快速排序,并通過調試理解遞歸流程。

7.總結

快速排序通過“分治 + Partition”高效解決排序問題,其核心在于:

  1. 分治思想:將大問題分解為小問題遞歸處理。
  2. 基準值選擇:直接影響算法性能,需結合實際場景優化。
  3. 時間復雜度:平均 O(n log n),是多數場景下的首選排序算法。

掌握快速排序不僅為后續算法(如快速選擇、歸并排序)奠定基礎,更是理解分治與遞歸思維的經典案例。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80249.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80249.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在現代Web應用中集成 PDF.js (pdfjs-dist 5.2 ESM): 通過 jsdelivr 實現動態加載與批注功能的思考

PDF 文檔在現代 Web 應用中越來越常見&#xff0c;無論是作為文檔預覽、報告展示還是在線編輯的載體。Mozilla 的 PDF.js 是一個功能強大的 JavaScript 庫&#xff0c;它使得在瀏覽器端渲染和顯示 PDF 文件成為可能&#xff0c;無需依賴原生插件。 本文將深入探討如何在你的項…

基于FPGA控制ADC0832雙通道采樣+電壓電流采樣+LCD屏幕顯示

基于FPGA控制ADC0832雙通道采樣電壓電流采樣LCD屏幕顯示 前言一、芯片手冊閱讀1.SPI通信時序 二、仿真分析三、代碼分析總結視頻演示 前言 定制 要求使用ADC0832芯片進行ADC采樣。其中電壓采樣以及電流采樣是固定電路&#xff0c;是硬件設計&#xff0c;跟軟件沒沒關系。本質上…

生產部署方案pm2配合python3腳本

前言 使用python3來處理redis 消息隊列&#xff0c;記錄下生產部署方案 「生產部署方案」&#xff1a; 多進程&#xff08;動態擴容&#xff09;無限自愈日志自動壓縮系統級守護可多隊列多worker 終極穩健版&#xff1a;PM2 Logrotate 自動擴容 守護鏈 適合&#xff1a…

Python全流程開發實戰:基于IMAP協議安全下載個人Gmail郵箱內所有PDF附件

文章目錄 一、需求分析與安全前置&#xff1a;為什么需要專用工具&#xff1f;1.1 痛點場景1.2 技術方案選擇 二、準備工作&#xff1a;Gmail賬號安全配置與環境搭建2.1 開啟兩步驗證&#xff08;必做&#xff01;&#xff09;2.2 創建應用專用密碼&#xff08;替代普通密碼&am…

巧用python之--模仿PLC(PLC模擬器)

工作中用到了VM(VisionMaster4.3)有時候需要和PLC打交道,但是PLC畢竟是別人的,不方便修改別人的程序,這時候需要一個靈活的PLC模擬器是多么好呀! 先說背景: PLC型號 匯川Easy521: Modbus TCP 192.168.1.10:502 在匯川Easy521中Modbus保持寄存器D寄存器 ,在modbus協議中 0-4區…

docker構建鏡像并上傳dockerhub

docker構建鏡像并上傳dockerhub 前提條件&#xff1a;需要連接梯子 將梯子配置到虛擬機中&#xff08;確保主機能夠連接 hub.docker.com&#xff09; 使用ipconfig 查詢主機的 ip4地址虛擬機的連接模式改成橋接模式&#xff08;復制主機的地址網絡&#xff09;將ip4配置到虛擬…

python實現的音樂播放器

python實現的音樂播放器 音樂播放器,原來寫過一個簡陋的例子,可見 https://blog.csdn.net/cnds123/article/details/137874107 那個不能拖動播放進度條上的滑塊到新的位置播放。下面介紹的可以拖動播放進度條上的滑塊到新的位置播放。 簡單實用的音樂播放器 這個簡單實用的…

[網安工具] 端口信息收集工具 —— 御劍高速 TCP 全端口掃描工具 · 使用手冊

&#x1f31f;想了解其它網安工具&#xff1f;看看這個&#xff1a;[網安工具] 網絡安全工具管理 —— 工具倉庫 管理手冊 https://github.com/NepoloHebo/Yujian-high-speed-TCP-full-port-scannerhttps://github.com/NepoloHebo/Yujian-high-speed-TCP-full-port-scanner 0…

數字孿生賦能智慧城市:從概念到落地的深度實踐

在城市規模與復雜度持續攀升的當下&#xff0c;傳統管理模式已難以滿足現代城市精細化治理需求。數字孿生技術憑借構建虛擬城市鏡像、實現實時數據交互與智能決策的特性&#xff0c;成為智慧城市建設的核心引擎。本文將通過多個典型案例&#xff0c;深度解析數字孿生技術如何重…

DeFi開發系統軟件開發:技術架構與生態重構

DeFi開發系統軟件開發&#xff1a;技術架構與生態重構 ——2025年去中心化金融開發的范式革新與實踐指南 一、技術架構演進&#xff1a;從單一鏈到多鏈混合引擎 現代DeFi系統開發已從單一公鏈架構轉向“跨鏈互操作混合模式”&#xff0c;結合中心化效率與去中心化安全雙重優勢…

相同IP和端口的服務器ssh連接時出現異常

起因 把服務器上的一個虛擬機搞壞了&#xff0c;所以刪除重新創建了一個&#xff0c;端口號和IP與之前的虛擬機相同。 ssh usernameIP -p port 時報錯 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone…

驗證es啟動成功

1. 查看命令行輸出信息 在啟動 Elasticsearch 時&#xff0c;命令行窗口會輸出一系列日志信息。若啟動成功&#xff0c;日志里通常會有類似下面的信息&#xff1a; plaintext [2025-05-06T13:20:00,000][INFO ][o.e.n.Node ] [node_name] started其中 [node_na…

CentOS網絡之network和NetworkManager深度解析

文章目錄 CentOS網絡之network和NetworkManager深度解析1. CentOS網絡服務發展歷史1.1 傳統network階段&#xff08;CentOS 5-6&#xff09;1.2 過渡期&#xff08;CentOS 7&#xff09;1.3 新時代&#xff08;CentOS 8&#xff09; 2. network和NetworkManager的核心區別3. ne…

Unity:父掛 Rigidbody2D、子掛 Collider2D 時觸發器不生效的問題分析

目錄 ?問題現象 &#x1f50d; 排查與定位 ?? Unity 觸發機制的核心要求 ? 為什么把 Collider2D 移到父物體后就能觸發&#xff1f; &#x1f4a1; 解決方案 在 Unity 2D 游戲開發中&#xff0c;很多人習慣用父物體掛載 Rigidbody2D&#xff0c;而將不同的身體部位&am…

Google AI版圖:解析AI Studio, Gemini, NotebookLM與GCP

1. 2C vs 2B: AI Studio: 主要是面向開發者&#xff0c;提供一個易用的界面來探索和構建基于Google模型的應用。雖然最終的應用可能服務于C端或B端&#xff0c;但AI Studio本身更多是一個開發者的工具平臺&#xff0c;可以看作是連接模型能力和各種應用的橋梁。它可以被個人開…

Oracle EBS AP發票被預付款核算創建會計科目時間超長

背景 由于客戶職能部門的水電、通信和物業等等費用統一管理或對接部門報銷費,在報銷費的時候,用戶把所有費用分攤到各個末級部門,形成AP發票行有上千行, 問題癥狀 1、用戶過賬時,請求創建會計科目一直執行20多個小時未完成,只能手工強行取消請求。 2、取消請求以后,從后…

MySQL中MVCC指什么?

簡要回答&#xff1a; MVCC&#xff08;multi version concurrency control&#xff09;即多版本并發控制&#xff0c;為了確保多線程下數據的安全&#xff0c;可以通過undo log和ReadView來實現不同的事務隔離級別。 對于已提交讀和可重復讀隔離級別的事務來說&#xff0c;M…

賽季7靶場 -- Checker --User flag

本系列僅說明靶場的攻擊思路&#xff0c;不會給出任何的詳細代碼執行步驟&#xff0c;因為個人覺得找到合適的工具以實現攻擊思路的能力也非常重要。root要逆向&#xff0c;沒做了&#xff0c;但是user flag也有借鑒意義&#xff0c;關于2FA的繞過我們有必要了解 1.首先Nmap掃描…

【RAG技術全景解讀】從原理到工業級應用實踐

目錄 &#x1f31f; 前言&#x1f3d7;? 技術背景與價值&#x1f6a8; 當前技術痛點&#x1f6e0;? 解決方案概述&#x1f465; 目標讀者說明 &#x1f50d; 一、技術原理剖析&#x1f4d0; 核心概念圖解&#x1f4a1; 核心作用講解?? 關鍵技術模塊說明?? 技術選型對比 &…

【嵌入式開發-RS-485】

嵌入式開發-RS-485 ■ RS-485 連接方式■ RS-485 半雙工通訊■ RS-485 的特點■ UART硬流控■ RS-4851. 全雙工、半雙工接線2. 拓撲結構3. RS-485收發器3.1 發送模式&#xff08;TX&#xff09;3.2 接收模式&#xff08;RX&#xff09; 4. RS-485數據鏈路5. RS-485常用電路6. C…