數據結構自學Day13 -- 快速排序--“分而治之”

🔶 一、快速排序(Quick Sort)

📌 基本思想:

分而治之

????????每次從數組中選一個“基準”(pivot),把比它小的放左邊,大的放右邊。

  • 對左右子數組遞歸排序。

🧠 排序過程:

  1. 選擇一個基準(如第一個或最后一個元素)。

  2. 使用雙指針或 Lomuto/Hoare 分區法將數組分為左右兩部分。

  3. 對左右子數組遞歸調用快速排序。

?? 時間復雜度:

情況

時間復雜度

最好情況

O(n log n)

平均情況

O(n log n)

最壞情況

O(n2)(當數組幾乎有序或元素都相同時)

?? 穩定性:

不穩定排序

? 優點:

  • 速度快:在大多數實際情況下性能極佳。

  • 原地排序:不需要額外內存。

  • 幾乎是排序算法中的性能王者(除非你特別追求穩定性)。

? 缺點:

  • 最壞情況下可能退化為 O(n2)。當我們選擇的基準為最大元素或者最小元素

  • 遞歸層數深時可能棧溢出(需優化)。

  • 算法思維:

  • 選擇基準值,利用雙指針遍歷數組,將比基準值小的放置左邊,比基準值大的放置右邊。

  • 思維導圖:

代碼實現:


?int PartSort(int* arr,int left,int right){assert(arr);int key_index = right;int begin = left;int end = right;while (begin< end){ while(begin < end && arr[begin] <= arr[key_index]){begin++;}while(begin < end && arr[end] >= arr[key_index]){end--;}Swap(&arr[begin],&arr[end]);}Swap(&arr[key_index],&arr[begin]);return begin;
}
void QuickSort(int* arr,int left,int right){assert(arr);if(left<right){int div = PartSort(arr,left,right);QuickSort(arr,left,div-1);QuickSort(arr,div+1,right);}
}

注意??:

? ? ? ? 快速排序如果選擇的基準值(key)如果為序列中的最大最小元素時,需要開辟非常多的棧,非常容易導致棧溢出,以及時間復雜度也會更高,最高為O(N^2)。所以為此要避免選取最大元素或者最小元素,比如有序序列時。

快速排序改進方法:

? ? ? ? “三數取中”:保證不要選到最小或者最大,讓有序時最為優;

思維導圖:

??代碼實現:

//三數取中優化
int get_midindex(int*arr,int left,int right){assert(arr);int mid = left+(right-left)/2;if(arr[left]>= arr[mid] && arr[left]<=arr[right] || arr[left]<= arr[mid] && arr[left]>=arr[right]){return left;}else if(arr[mid]>= arr[left] && arr[mid]<=arr[right] || arr[mid]<= arr[left] && arr[mid]>=arr[right]){return mid;}else{return right;}}

快速排序總結:

  • 對于升序排序:begin找>= key的數,end找<= key的數。

  • 對于降序排序:begin找<= key的數,end找>= key的數。

  • 快速排序中的begin和end是尋找左右錯位元素進行交換的關鍵。

  • 最后交換基準值和begin所指的元素,完成一次劃分。

  • 對于有序序列,我們需要利用一個“三數取中”規避選取最大或者最小元素作為基準值,增加復雜度和額外的棧的開辟。

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

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

相關文章

Linux 進程與服務管理~進程基礎、進程查看、進程控制、服務管理、開機啟動??

在 Linux 系統中,進程與服務管理是運維和開發的核心技能之一。進程是程序運行的實例,服務是長期運行的后臺進程(守護進程)。掌握進程與服務的管理方法,能有效排查系統問題、優化資源使用。以下從 ??進程基礎、進程查看、進程控制、服務管理、開機啟動?? 五大模塊詳細講…

論文筆記 | Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes

論文地址&#xff1a;Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes 概述&#xff1a;本文提出 RGB-Stacking 基準測試&#xff0c;研究如何僅憑 RGB 攝像頭視覺和本體感知&#xff0c;實現機器人對 復雜幾何物體的高效堆疊。通過結合仿真專家訓練、交互…

React 英語打地鼠游戲——一個寓教于樂的英語學習游戲

&#x1f3af; 英語打地鼠游戲 一個寓教于樂的英語學習游戲&#xff0c;通過經典的打地鼠玩法幫助用戶學習英語單詞。 ? 項目特色 &#x1f3ae; 游戲化學習 經典打地鼠玩法&#xff1a;6 個洞穴&#xff0c;聽英文選單詞即時反饋&#xff1a;答對/答錯立即語音提示計分系…

Qt--Widget類對象的構造函數分析

Widget類對象的構造函數分析&#xff0c;用更直觀的方式解釋這段代碼的作用和工作原理&#xff1a;代碼&#xff1a;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }代碼解析 Widget::Widget(QWidget *parent) // 構造函數定…

使用pytorch創建模型時,nn.BatchNorm1d(128)的作用是什么?

在PyTorch中&#xff0c;nn.BatchNorm1d(128) 的作用是對 一維輸入數據&#xff08;如全連接層的輸出或時間序列數據&#xff09;進行批標準化&#xff08;Batch Normalization&#xff09;&#xff0c;具體功能與實現原理如下&#xff1a; 1. 核心作用 標準話數據分布 對每個批…

【數據結構】二叉樹的鏈式結構--用C語言實現

1.二叉樹的鏈式結構 此前&#xff0c;我們通過數組&#xff08;順序表&#xff09;完成了二叉樹的順序存儲&#xff0c;并實現了二叉樹的基礎功能 那么&#xff0c;二叉樹還有沒有其他存儲方式呢&#xff1f; 前面我們學習了鏈表&#xff0c;它是一種線性結構&#xff0c;而二…

java設計模式 -【適配器模式】

適配器模式的定義 適配器模式&#xff08;Adapter Pattern&#xff09;是一種結構型設計模式&#xff0c;用于解決接口不兼容問題。通過將一個類的接口轉換成客戶端期望的另一個接口&#xff0c;使原本因接口不匹配而無法工作的類能夠協同工作。 核心角色 目標接口&#xff08;…

前端,demo操作,增刪改查,to do list小項目

demo操作&#xff0c;html<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>&l…

Spring AI 項目實戰(十九):Spring Boot + AI + Vue3 + OSS + DashScope 構建多模態視覺理解平臺(附完整源碼)

系列文章 序號 文章名稱 1 Spring AI 項目實戰(一):Spring AI 核心模塊入門 2 Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼) 3 Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼) 4

在 Ubuntu 20.04.5 LTS 系統上安裝 Docker CE 26.1.4 完整指南

在 Ubuntu 20.04.5 LTS 系統上安裝 Docker CE 26.1.4 完整指南版本選擇說明 為什么選擇 Docker CE 26.1.4&#xff1f; 1. 版本穩定性和成熟度 Docker CE 26.1.4 是 2024 年 5 月發布的穩定版本&#xff0c;經過了充分的測試和驗證相比最新的 28.x 版本&#xff0c;26.1.4 在生…

避坑指南:Windows 11中 Docker 數據卷的存放位置

在 PowerShell 中使用 docker volume inspect 命令&#xff0c;輸出如下&#xff1a; [{"CreatedAt": "2025-07-23T01:00:45Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/…

Hadoop大數據集群架構全解析

技術概述Hadoop的定義及其在大數據領域的地位Hadoop是由Apache基金會開發的開源分布式計算框架&#xff0c;基于Google的MapReduce和GFS論文思想實現&#xff0c;已成為大數據處理的事實標準。它通過分布式存儲和計算解決了傳統數據庫無法處理的海量數據存儲和分析問題&#xf…

【自動化測試】Selenium Python UI自動化測試實用教程

一、引言:Selenium與UI自動化測試基礎 1.1 Selenium簡介 Selenium是一個開源的Web應用自動化測試框架,支持多瀏覽器(Chrome、Firefox、Edge等)和多編程語言(Python、Java、JavaScript等),核心組件包括: WebDriver:通過瀏覽器原生API控制瀏覽器,模擬用戶操作(點擊、…

基于VSCode的nRF52840開發環境搭建

nRF52840是Nordic Semiconductor推出的一款功能強大的多協議SoC&#xff0c;廣泛應用于物聯網設備、可穿戴設備和低功耗藍牙產品開發。本篇文章將詳細介紹如何在VSCode中搭建完整的nRF52840開發環境&#xff0c;讓您能夠高效地進行嵌入式開發。 一、準備工作 VSCode&#xff1a…

GStreamer開發筆記(九):gst-rtcp-server安裝和部署實現簡單的rtsp-server服務器推流Demo

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/149054288 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、O…

C++ namespace機制以及同時使用多個namespace可能存在的問題

在一個 .cpp 文件中使用了多個 using namespace 會怎么樣&#xff1f; 核心答案是&#xff1a;可能會導致“命名沖突&#xff08;Name Collision&#xff09;”和“二義性&#xff08;Ambiguity&#xff09;”&#xff0c;從而引發編譯錯誤。 當你使用 using namespace SomeNam…

基于R語言的分位數回歸技術應用

回歸是科研中最常見的統計學研究方法之一&#xff0c;在研究變量間關系方面有著極其廣泛的應用。由于其基本假設的限制&#xff0c;包括線性回歸及廣義線性回歸在內的各種常見的回歸方法都有三個重大缺陷&#xff1a;(1)對于異常值非常敏感&#xff0c;極少量的異常值可能導致結…

網絡I/O模型詳解-一次了解全部(面試經常會問到相關知識)

前言 網絡I/O模型的五種類型&#xff0c;其實在我們開發程序、設計程序、實現程序的方方面面都一直存在著&#xff0c;本文從實現原理、使用場景、優缺點、詳細的流程圖等方面進行深入的解釋&#xff0c;幫助大家更好的理解常用的五種網絡io模型&#xff0c;助力大家在工作、面…

面試150 合并K個升序鏈表

思路 對鏈表元素進行獲取&#xff0c;然后進行sort()排序&#xff0c;最后通過空節點建立鏈表法重新建立一個有序的鏈表&#xff0c;返回頭節點即可。 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val …

BitDistiller:通過自蒸餾釋放 Sub-4-Bit 大語言模型的潛力

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" BitDistiller&#xff1a;通過自蒸餾釋放 Sub-4-Bit 大語言模型的潛力 摘要 大語言模型&#xff08;LLMs&#xff09;的規模不斷擴大&#xff0c;在自然語言處理方面取得了令人矚目的進展&#xff0c;但這也帶來…