數據結構|排序算法(一)快速排序

一、排序概念

排序是數據結構中的一個重要概念,它是指將一組數據元素按照特定的順序進行排列的過程,默認是從小到大排序。

常見的八大排序算法:

插入排序、希爾排序、冒泡排序、快速排序、選擇排序、堆排序、歸并排序、基數排序

二、快速排序(重點常考)

1.算法思想:

通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,然后分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。

2.算法步驟:

1.選擇一個基準值(通常選擇序列的第一個元素或最后一個元素)。
2.從序列的兩端開始,設置兩個指針,一個指向序列的起始位置(left),一個指向序列的結束位置(right)。
3.從 right 指針開始,向左移動 right 指針,找到第一個小于基準值的元素,(從后往前找,找比基準小的數字,往前挪),然后從 left 指針開始,向右移動 left 指針,找到第一個大于基準值的元素(從前往后找,找比基準大的數字,往后挪)
4.交換 left 和 right 指針所指向的元素。
5.重復步驟 3 和 4,直到 left 和 right 指針相遇。此時,將基準值與 left 指針所指向的元素交換位置,這樣基準值就處于正確的排序位置上,并且其左邊的元素都小于它,右邊的元素都大于它。(完成快速排序的一次劃分)
6.對基準值左邊和右邊的子序列分別重復步驟 1 到 5,直到子序列的長度為 1 或 0,此時整個序列就已經有序。

3.代碼實現:

//代碼實現
#include<stdio.h>
int Partition(int* arr, int left, int right)//一次劃分
{int tmp = arr[left];//基準while (left < right){//從后往前找比基準小的數字,往前移動while (left<right&&arr[right] > tmp){right--;}if (left < right)//判斷循環出口條件{arr[left] = arr[right];}//從前往后找比基準大的數字,往后移動while (left < right && arr[left] <= tmp){left++;}if (left < right){arr[right] = arr[left];}}arr[left] = tmp;return left;
}
void Quick(int* arr, int left, int right)//遞歸調用一次劃分
{int par = Partition(arr, left, right);if(left<par-1)//左邊序列長大于1{Quick(arr, left, par - 1);}if (par + 1 < right)//右邊序列長大于1{Quick(arr, par+1, right);}
}
void QuickSort(int* arr, int len)//快速排序
{Quick(arr, 0, len - 1);
}
void Show(int *arr, int size) 
{for (int i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}

4.復雜度分析

5.快速排序特點

優點:平均時間復雜度;不需要額外的存儲空間,高效使用內存。

缺點:不穩定,空間復雜度大 ;越有序越慢,完全有序時間復雜度為O(n^2)。

以上是排序算法第一部分關于快速排序的知識,如果有幫助可以點贊收藏一下,會持續更新輸出有用的內容,感興趣可以關注我!

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

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

相關文章

如何確保MQ消息隊列不丟失:Java實現與流程分析

前言 在分布式系統中&#xff0c;消息隊列&#xff08;Message Queue, MQ&#xff09;是核心組件之一&#xff0c;用于解耦系統、異步處理和削峰填谷。然而&#xff0c;消息的可靠性傳遞是使用MQ時需要重點考慮的問題。如果消息在傳輸過程中丟失&#xff0c;可能會導致數據不一…

關于termux運行pc交叉編譯的aarch64 elf的問題

在Linux系統上交叉編譯Nim程序到Android Termux環境需要特殊處理&#xff0c;以下是詳細的解決方案&#xff1a; 問題根源分析 ??ABI不兼容?? Android使用bionic libc而非標準glibc&#xff0c;直接編譯的Linux ARM二進制無法直接運行 ??動態鏈接錯誤?? 默認編譯會鏈…

為PXIe控制器配置NI Linux實時操作系統安裝軟件

一、升級BIOS 使用NI Linux Real-Time操作系統的PXI硬件支持頁面來確定NI Linux Real-Time是否支持您的PXIe控制器&#xff0c;以及是否需要更新控制器BIOS。 按照BIOS下載頁面上的“安裝說明”部分安裝BIOS更新。 注意&#xff1a;NI在NI 2020軟件版本中刪除對cRIO的Phar Lap和…

《汽車噪聲控制》課程作業

作業內容 在MATLAB繪制給出單個正弦波或余弦波的時域圖和頻域圖 繪制實測數據的時域圖和頻域圖 圖1 單個正弦波的時頻圖 圖1 單個正弦波的時頻圖 % 正弦波參數設置 f0 1000; % 信號頻率 1kHz Fs 16384; % 采樣頻率 16kHz T 0.05; % 信號持續時間 0.05秒 A 0.8; % 信號幅度…

Baklib內容中臺AI技術協同應用

內容中臺與AI協同創新 在數字化轉型進程中&#xff0c;內容中臺通過人工智能技術的深度整合&#xff0c;正重塑企業信息管理范式。以Baklib內容中臺為例&#xff0c;其通過智能語義分析引擎解析用戶意圖&#xff0c;結合知識圖譜構建技術動態關聯碎片化信息&#xff0c;實現從…

壓測工具開發實戰篇(二)——構建側邊欄以及設置圖標字體

你好&#xff0c;我是安然無虞。 文章目錄 構建側邊欄QtAwesome使用調整側邊欄寬度了解: sizePolicy屬性偽狀態 在閱讀本文之前, 有需要的老鐵可以先回顧一下上篇文章: 壓測工具開發(一)——使用Qt Designer構建簡單界面 構建側邊欄 我們要實現類似于下面這樣的側邊欄功能: …

Axure RP9.0教程: 查詢條件隱藏與顯示(綜合了動態面板狀態切換及展開收縮效果實現)

文章目錄 引言I 原型顯示/隱藏搜索框思路步驟詳細操作II 若依 ruoyi 顯示/隱藏搜索框 & 顯示隱藏列自定義設置顯示隱藏列顯示/隱藏搜索框引言 數據篩選有大量的查詢條件時,可以選擇查詢隱藏效果。 I 原型顯示/隱藏搜索框 綜合了動態面板狀態切換及展開收縮效果實現 思…

解鎖工業通信:Profibus DP到ModbusTCP網關指南!

解鎖工業通信&#xff1a;Profibus DP到ModbusTCP網關指南&#xff01; 在工業自動化領域&#xff0c;隨著技術的不斷進步和應用場景的日益復雜&#xff0c;不同設備和系統之間的通訊協議兼容性問題成為了工程師們面臨的一大挑戰。尤其是在Profibus DP和Modbus/TCP這兩種廣泛應…

3維格式轉換(二)

基于python的三維模型演化可視化 本項目的主要內容為總結了3種不同的可視化方案( trimesh + matplotlib 庫、 pyvista 庫、 vedo 庫),并通過案例對可視化效果進行展示,最終通過模型動態演化案例給出最佳效果的可視化方案 本期結構圖為 本期博客結構圖 0 環境搭建 項目開…

docker導出image再導入到其它docker中

導出image docker save -o gxc_tenant.tar vue_tenant:1.0 eitc_tenant:1.0 redis:latest docker.io/mysql:8.0 minio/minio導入image docker load -i gxc_tenant.tar

Spring-IOC部分

Spring-IOC部分 1.SpringBean的配置詳解&#xff08;Bean標簽&#xff09; &#xff08;1&#xff09;scope 默認情況下&#xff0c;單純的Spring環境Bean的作用范圍有兩個&#xff1a;Singleton和Prototype singleton&#xff1a;單例&#xff0c;默認值&#xff0c;Spring…

人工智能爬蟲導致維基共享資源帶寬需求激增 50%

2025 年 4 月 1 日&#xff0c;維基媒體基金會在博文中表示&#xff0c;自 2024 年 1 月以來&#xff0c;維基共享資源下載多媒體的帶寬消耗激增 50%&#xff0c;這一變化趨勢主要由用于 AI 訓練數據集的網絡爬蟲導致。以下是具體分析1&#xff1a; 爬蟲流量特征與數據存儲模式…

2007-2019年各省地方財政交通運輸支出數據

2007-2019年各省地方財政交通運輸支出數據 1、時間&#xff1a;2007-2019年 2、來源&#xff1a;國家統計局、統計年鑒 3、指標&#xff1a;行政區劃代碼、地區、年份、地方財政交通運輸支出 4、范圍&#xff1a;31省 5、指標說明&#xff1a;地方財政交通運輸支出是指地方…

【爬蟲開發】爬蟲開發從0到1全知識教程第14篇:scrapy爬蟲框架,介紹【附代碼文檔】

本教程的知識點為&#xff1a;爬蟲概要 爬蟲基礎 爬蟲概述 知識點&#xff1a; 1. 爬蟲的概念 requests模塊 requests模塊 知識點&#xff1a; 1. requests模塊介紹 1.1 requests模塊的作用&#xff1a; 數據提取概要 數據提取概述 知識點 1. 響應內容的分類 知識點&#xff1a…

【CMake】《CMake構建實戰:項目開發卷》筆記-Chapter8-生成器表達式

第8章 生成器表達式 生成器表達式&#xff08;generator expression&#xff09;是由CMake生成器進行解析的表達式&#xff0c;因此&#xff0c;這些表達式只有在CMake的生成階段才被解析為具體的值。 CMake在生成階段&#xff0c;能夠根據具體選用的構建系統生成器生成特定…

Docker安裝、配置Mysql5.7

1.創建必要的目錄 # 創建目錄 mkdir -p ~/docker/software/mysql/{conf,log,data} 2.如果沒有docker-compose.yml文件的話&#xff0c;先創建docker-compose.yml 配置文件一般長這個樣子 version: 3services:mysql:image: mysql:5.7.36container_name: mysqlports:- "…

【C++學習筆記】十三、速通筆記

完整的C編程教程 目錄 開發環境配置C知識體系現代C特性設計模式數據結構CMake項目構建調試技巧進階主題學習資源 1. 開發環境配置 1.1 安裝編譯器 sudo apt-get install g build-essential1.2 安裝構建工具 sudo apt-get install cmake1.3 VS Code配置 安裝C擴展配置調試…

網絡運維學習筆記(DeepSeek優化版)027 OSPF外部路由計算

文章目錄 OSPF外部路由計算1. 實驗拓撲與基礎配置2. 關鍵配置命令2.1 引入靜態路由2.2 查看路由表 3. LSA生成與傳播分析3.1 ASBR角色通告&#xff08;1類LSA&#xff09;3.2 外部路由通告&#xff08;5類LSA&#xff09;3.3 外部路由引入過程 4. 5類LSA關鍵字段解析5. 外部路由…

【Python使用】嘿馬推薦系統全知識和項目開發教程第2篇:1.4 案例--基于協同過濾的電影推薦,1.5 推薦系統評估【附代碼

教程總體簡介&#xff1a;1.1 推薦系統簡介 學習目標 1 推薦系統概念及產生背景 2 推薦系統的工作原理及作用 3 推薦系統和Web項目的區別 1.3 推薦算法 1 推薦模型構建流程 2 最經典的推薦算法&#xff1a;協同過濾推薦算法&#xff08;Collaborative Filtering&#xff09; 3 …

運算放大器(五)電壓比較器

比較器在最常用的簡單集成電路中排名第二&#xff0c;僅次于排名第一的運算放大器。 電壓比較器是一種用來比較輸入信號電壓與參考電壓大小&#xff0c;并將比較結果以高電平或低電平形式輸出的一種信號處理電路&#xff0c;廣泛應用于各種非正弦波的產生和變換電路中&#xf…