常用排序方法

一、排序的概念及引用

1、排序的概念

排序:所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。

穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,則稱這種排序算法是穩 定的;否則稱為不穩定的。

內部排序:數據元素全部放在內存中的排序。

外部排序:數據元素太多不能同時放在內存中,根據排序過程的要求不能在內外存之間移動數據的排序。

2、常見的排序算法

二、常見排序算法的實現

1、插入排序

1.1基本思想:

直接插入排序是一種簡單的插入排序法,其基本思想是:

把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的記錄插入完為止,得到 一個新的有序序列 。實際中我們玩撲克牌時,就用了插入排序的思想。

1.2直接插入排序

當插入第i(i>=1)個元素時,前面的array[0],array[1],…,array[i-1]已經排好序,此時用array[i]的排序碼與array[i 1],array[i-2],…的排序碼順序進行比較,找到插入位置即將array[i]插入,原來位置上的元素順序后移

直接插入排序的特性總結:

(1)元素集合越接近有序,直接插入排序算法的時間效率越高

(2)時間復雜度:O(N^2)

(3)空間復雜度:O(1),它是一種穩定的排序算法

(4)穩定性:穩定

1.3希爾排序( 縮小增量排序 )

希爾排序法又稱縮小增量法。希爾排序法的基本思想是:先選定一個整數,把待排序文件中所有記錄分成多個組, 所有距離為的記錄分在同一組內,并對每一組內的記錄進行排序。然后,取,重復上述分組和排序的工作。當到達 =1時,所有記錄在統一組內排好序。

希爾排序的特性總結:

(1)希爾排序是對直接插入排序的優化。

(2)當gap > 1時都是預排序,目的是讓數組更接近于有序。當gap == 1時,數組已經接近有序的了,這樣就會很 快。這樣整體而言,可以達到優化的效果。我們實現后可以進行性能測試的對比。

(3)希爾排序的時間復雜度不好計算,因為gap的取值方法很多,導致很難去計算,因此在好些樹中給出的希爾排序的時間復雜度都不固定,我們暫時就按照:O(n^1.25)到O(1.6*n^1.25)來算。

(4)穩定性:不穩定

2、選擇排序

2.1基本思想

每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完 。

2.2直接選擇排序

(1)在元素集合array[i]--array[n-1]中選擇關鍵碼最大(小)的數據元素

(2)若它不是這組元素中的最后一個(第一個)元素,則將它與這組元素中的最后一個(第一個)元素交換

(3)在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重復上述步驟,直到集合剩余1個元素

【直接選擇排序的特性總結】

(1)直接選擇排序思考非常好理解,但是效率不是很好。實際中很少使用

(2)時間復雜度:O(N^2)

(3)空間復雜度:O(1)

(4)穩定性:不穩定

2.3堆排序

堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種。它是通過堆來進行選擇數據。需要注意的是排升序要建大堆,排降序建小堆。

【直接選擇排序的特性總結】

(1)堆排序使用堆來選數,效率就高了很多。

(2)時間復雜度:O(N*logN)

(3)空間復雜度:O(1)

(4)穩定性:不穩定

3、交換排序

基本思想:所謂交換,就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置,交換排序的特點是:將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動。

3.1冒泡排序

【冒泡排序的特性總結】

(1)冒泡排序是一種非常容易理解的排序

(2)時間復雜度:O(N^2)

(3)空間復雜度:O(1)

(4)穩定性:穩定

3.2快速排序

快速排序是Hoare于1962年提出的一種二叉樹結構的交換排序方法,其基本思想為:任取待排序元素序列中的某元 素作為基準值,按照該排序碼將待排序集合分割成兩子序列,左子序列中所有元素均小于基準值,右子序列中所有 元素均大于基準值,然后最左右子序列重復該過程,直到所有元素都排列在相應位置上為止。

 // 假設按照升序對array數組中[left, right)區間中的元素進行排序void QuickSort(int[] array, int left, int right){if(right - left <= 1)return;// 按照基準值對array數組的 [left, right)區間中的元素進行劃分int div = partion(array, left, right);// 劃分成功后以div為邊界形成了左右兩部分 [left, div) 和 [div+1, right)// 遞歸排[left, div)QuickSort(array, left, div);// 遞歸排[div+1, right)QuickSort(array, div+1, right);}

上述為快速排序遞歸實現的主框架,發現與二叉樹前序遍歷規則非常像,同學們在寫遞歸框架時可想想二叉樹前序 遍歷規則即可快速寫出來,后序只需分析如何按照基準值來對區間中數據進行劃分的方式即可。

將區間按照基準值劃分為左右兩半部分的常見方式有:

(1)Hoare版

 private static int partition(int[] array, int left, int right) {int i = left;int j = right;int pivot = array[left];while (i < j) {while (i < j && array[j] >= pivot) {j--;}while (i < j && array[i] <= pivot) {i++;}swap(array, i, j);}swap(array, i, left);return i;}
(2)挖坑法

 private static int partition(int[] array, int left, int right) {int i = left;int j = right;int pivot = array[left];while (i < j) {while (i < j && array[j] >= pivot) {j--;}array[i] = array[j];while (i < j && array[i] <= pivot) {i++;}array[j] = array[i];}array[i] = pivot;return i;}
(3)前后指針

寫法一:

private static int partition(int[] array, int left, int right) {int prev = left ;int cur = left+1;while (cur <= right) {if(array[cur] < array[left] && array[++prev] != array[cur]) {swap(array,cur,prev);}cur++;}swap(array,prev,left);return prev;}

寫法二:

private static int partition(int[] array, int left, int right) {int d = left + 1;int pivot = array[left];for (int i = left + 1; i <= right; i++) {if (array[i] < pivot) {swap(array, i, d);d++;}}swap(array, d - 1, left);return d - 1;}

3.3快速排序優化

(1)三數取中法選key

(2)遞歸到小的子區間時,可以考慮使用插入排序

3.4快速排序非遞歸

 void quickSortNonR(int[] a, int left, int right) {Stack<Integer> st = new Stack<>();st.push(left);st.push(right);while (!st.empty()) {right = st.pop();left = st.pop();if(right - left <= 1)continue;int div = PartSort1(a, left, right);// 以基準值為分割點,形成左右兩部分:[left, div) 和 [div+1, right)st.push(div+1);st.push(right);st.push(left);st.push(div);}}

3.5快速排序總結

(1)快速排序整體的綜合性能和使用場景都是比較好的,所以才敢叫快速排序

(2)時間復雜度:O(N*logN)

(3)空間復雜度:O(logN)

(4)穩定性:不穩定

4、歸并排序

4.1基本思想

歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。

4.2歸并排序總結

(1)歸并的缺點在于需要O(N)的空間復雜度,歸并排序的思考更多的是解決在磁盤中的外排序問題。

(2)時間復雜度:O(N*logN)

(3)空間復雜度:O(N)

(4)穩定性:穩定

4.3海量數據的排序問題

外部排序:排序過程需要在磁盤等外部存儲進行的排序

前提:內存只有 1G,需要排序的數據有 100G

因為內存中因為無法把所有數據全部放下,所以需要外部排序,而歸并排序是最常用的外部排序

????????????????(1)先把文件切分成 200 份,每個 512 M

????????????????(2)分別對 512 M 排序,因為內存已經可以放的下,所以任意排序方式都可以

????????????????(3)進行 2路歸并,同時對 200 份有序文件做歸并過程,最終結果就有序了

三、排序算法復雜度及穩定性分析

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

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

相關文章

接口返回504 Gateway Time-out 錯誤,這意味著請求在網關或代理服務器等待上游服務器響應時超時。以下是可能的原因和排查建議:

問題分析1.后端處理耗時過長是某個方法執行時間過長&#xff0c;超過了網關的超時設置&#xff08;通常是幾十秒&#xff09;可能涉及大量數據查詢或復雜計算2.數據庫查詢性能問題查詢的數據量過大缺少必要的數據庫索引SQL語句執行效率低下排查建議1.檢查服務端日志查看應用日志…

DBAPI 實現不同角色控制查看表的不同列

DBAPI 實現不同角色控制查看表的不同列 場景說明 在數據庫管理系統中&#xff0c;對表進行列級別的權限控制是一項關鍵的安全措施&#xff0c;特別是在處理敏感數據或需要遵守特定數據訪問控制策略的情況下。合理的列權限控制不僅能保護敏感信息&#xff0c;還能幫助組織滿足合…

二維圖像處理(完整版)

目錄 1.變換矩陣 2.在矩陣的基礎上添加各種變換形式 3.開始變換 4.計算變換矩陣參數 新算子 二、閾值分割 新算子 三、blob分析案例 1.焊點 2.石頭 3.木材 4.車牌 5.骰子 新算子 四、傅里葉變換頻域分析 問題一 五、濾波處理 1.均值濾波 2.中值濾波 3.高斯…

計算機網絡:求地址塊128.14.35.7/20中的相關信息

128.14.35.7/20是某一地址塊&#xff0c;求該地址塊中的網絡地址&#xff0c;IP地址最大值&#xff0c;最小值&#xff0c;地址數 這里的最大值&#xff1a;廣播地址&#xff0c;最小值&#xff1a;網絡地址&#xff0c;地址數&#xff1a;可分配主機數 最關鍵的一步就點分十進…

3深度學習Pytorch-神經網絡--全連接神經網絡、數據準備(構建數據類Dataset、TensorDataset 和數據加載器DataLoader)

文章目錄一、深度學習概述二、神經網絡基礎人工神經網絡&#xff08;ANN&#xff09;基本結構神經網絡的構建全連接神經網絡&#xff08;FCN&#xff09;計算步驟基本組件1. 線性層組件2. 激活函數&#xff08;Activation Function&#xff09;3. 損失函數&#xff08;Loss Fun…

MyEclipse啟動OutOfMemoryError內存溢出

java.lang.OutOfMemoryError&#xff1a;Java heap space打開setting&#xff0c;搜索heap&#xff0c;compiler heap sizejava.lang.OutOfMemoryError&#xff1a;insufficient memory①點擊file&#xff0c;選擇Invalidate Caches ②點擊file->Build,Excetion,Deployment-…

java畢業設計實例-基于springboot的校園資訊分享平臺的設計與實現(源碼+LW+部署文檔+全bao+遠程調試+代碼講解等)

博主介紹&#xff1a;??碼農一枚 &#xff0c;專注于大學生項目實戰開發、講解和畢業&#x1f6a2;文撰寫修改等。全棧領域優質創作者&#xff0c;博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰 ??技術范圍&#xff1a;&am…

手寫 Spring

01 - 原始版本的 IOC 容器 IOC 容器的作用是自動創建對象&#xff0c;降低系統間的耦合度 core public interface Resource extends Iterator<Object>{ }外部的配置信息都當成 Resource (資源)來進行抽象 public class ClassPathXmlResource implements Resource {Docume…

【物聯網】基于樹莓派的物聯網開發【24】——樹莓派安裝influxDB時序數據庫

使用背景 聚焦大數據底層技術軟件研發&#xff0c;實現時序數據采集、寫入、存儲、查詢、分析 場景介紹 用于存儲和分析時間序列數據的開源數據庫 安裝 InfluxDB 添加 InfluxDB 的倉庫&#xff1a; wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add - …

Python 程序設計講義(68):Python 的文件操作——使用os模塊操作文件

Python 程序設計講義&#xff08;68&#xff09;&#xff1a;Python 的文件操作——使用os模塊操作文件 目錄Python 程序設計講義&#xff08;68&#xff09;&#xff1a;Python 的文件操作——使用os模塊操作文件一、刪除文件&#xff1a;使用os.remove()函數二、重命名文件與…

uni-app 網絡請求終極選型:uni.request、axios、uni-network、alova 誰才是你的真命請求庫?

還在 uni-app 里手寫 uni.request 然后自己封裝到懷疑人生&#xff1f; 想用 axios 卻擔心小程序 2 MB 主包瞬間爆炸&#xff1f; 面對 alova、uni-network、axios 一臉懵&#xff0c;不知道選哪個才不踩坑&#xff1f; 這篇一次講透 4 大主流方案優缺點、適用場景和避坑指南&a…

2G內存的服務器用寶塔安裝php的fileinfo拓展時總是卡死無法安裝成功的解決辦法

臨時加大 Swap&#xff08;4G&#xff09; fallocate -l 4G /swapfile2 chmod 600 /swapfile2 mkswap /swapfile2 swapon /swapfile2 free -h確認現在有了足夠的 swap&#xff08;總內存 swap 應該達到 6G&#xff09;&#xff1a; free -h編譯 fileinfo 擴展&#xff08;只用…

DAY 41 簡單CNN

知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化&#xff1a;調整一個批次的分布&#xff0c;常用與圖像數據特征圖&#xff1a;只有卷積操作輸出的才叫特征圖調度器&#xff1a;直接修改基礎學習率 卷積操作常見流程如下&#xff1a; 1. 輸入 → 卷積層 → Batch歸一化層…

Flink 2.1 SQL:解鎖實時數據與AI集成,實現可擴展流處理

摘要&#xff1a;本文整理自阿里云的高級技術專家、Apache Flink PMC 成員李麟老師在 Flink Forward Asia 2025 新加坡[1]站 —— 實時 AI 專場中的分享。將帶來關于 Flink 2.1 版本中 SQL 在實時數據處理和 AI 方面進展的話題。Tips&#xff1a;點擊「閱讀原文」跳轉阿里云實時…

運維巡檢單(文檔)

1 運維巡檢表格 1.1 每日巡檢記錄單 1.2 周巡檢報告 1.3 季度巡檢報告 1.4 遠程服務記錄單 1.5 現場維護記錄單 1.6 現場運維巡檢服務單 1.7 服務器巡檢記錄 1.8 網絡設備巡檢記錄 1.9 視頻會議系統檢測表 1.10 機房巡檢報告 1.11 運維服務統計表 1.12 運維服務交接…

BLDC直流無刷電機工作原理

1.介紹什么是BLDC&#xff1f;BLDC&#xff08;Brushless Direct Current Motor&#xff0c;無刷直流電機&#xff09;是一種采用電子換向替代傳統機械電刷和換向器的直流電機&#xff0c;兼具直流電機的調速性能和交流電機的結構優勢在這之前我們先了解一般電機的分類以及直流…

Rust 實戰四 | Traui2+Vue3+Rspack 開發桌面應用:通配符掩碼計算器

往期回顧 Rust 實戰三 | HTTP 服務開發及 Web 框架推薦Rust 實戰二 | 開發簡易版命令行工具 grepRust 實戰一 | 用 RustRover 開發猜數字游戲Rust 安裝與版本更新 代碼開源地址&#xff1a;https://github.com/0604hx/rust-journey、通配符掩碼計算器 學習一門編程語言&#…

大型語言與進化算法潛在研究方向與挑戰

[1] WANG C, ZHAO J, JIAO L, 等. When Large Language Models Meet Evolutionary Algorithms: Potential Enhancements and Challenges[A/OL]. arXiv, 2025[2025-08-07]. http://arxiv.org/abs/2401.10510. DOI:10.48550/arXiv.2401.10510. 這篇文章《當大型語言模型遇到進化算…

計算二分類誤差時的常見錯誤及解決方案

計算二分類誤差時的常見錯誤及解決方案 在二分類任務中使用 error sum(y ! (y_hat > 0.5)) 計算分類錯誤時&#xff0c;可能遇到以下問題及解決方案&#xff1a; 1. 數據類型不匹配錯誤 問題&#xff1a;真實標簽 y 和預測值 y_hat 的數據類型不一致&#xff08;如 y 是整數…

uniapp-vue2導航欄全局自動下拉變色

全局自動下拉變色解決方案 雀語文章地址 &#x1f4d6; 項目簡介 這是一個基于 Vue.js 和 uni-app 的全局自動下拉變色解決方案&#xff0c;通過全局 mixin 實現頁面滾動時導航欄的自動顏色變化效果。 ? 核心特性 ● &#x1f3af; 全局自動生效&#xff1a;無需在每個頁面手動…