【數據結構】排序詳解(希爾排序,快速排序,堆排序,插入排序,選擇排序,冒泡排序)

目錄

0. 前情提醒:

1. 插入排序

1.1 基本思想:

1.2?直接插入排序

?實現步驟:

?動圖演示:

?特性總結:

?代碼實現:

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

基本思想:

步驟演示:

特性總結:

代碼實現:

2. 交換排序

2.1 基本思想:

2.2?冒泡排序

特性總結:

代碼實現:

2.3 快速排序

3.選擇排序

3.1 基本思想:

3.2 直接選擇排序

步驟思路:

動圖演示:?

特性總結:

代碼實現:

3.3 堆排序

代碼實現:


0. 前情提醒:

下面的所有代碼實現均為升序

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. 4.穩定性:穩定
?代碼實現:
void InsertSort(int* a, int n) {for (int i = 0; i < n; i++) {int m = a[i];int end = i;while (end > 0 && a[end - 1] > m) {a[end] = a[end - 1];end--;}a[end] = m;}
}
1.3 希爾排序(縮小增量排序)
基本思想:

先選定一個整數,把待排序的文件中所有(n個)記錄分成(n/gap)個組,所有距離為gap的記錄分在同一個組,并對每個組內的記錄進行排序。然后去gap=gap/2,重復上述分組和排序的工作。當到達gap=1時,所有記錄在統一組內排好序(gap=1時就是直接插入排序,gap>1時屬于預排序)。

步驟演示:

特性總結:
  1. 希爾排序是對直接插入排序的優化
  2. 當gap>1時都是預排序,目的是讓數組更接近有序。當gap==1時,數組已經接近有序,這樣排序就會很快。這樣整體而言,可以達到優化的效果
  3. 希爾排序的時間復雜度不好計算,因為gap的取值方法很多,導致很難去計算,因此在不同書上給出的希爾排序的時間復雜度都不一樣
代碼實現:
void ShellSort(int* a, int n) {int gap = n;while (gap > 1) {gap = gap / 3 + 1;for (int i = 0; i < n; i++) {int m = a[i];int end = i;while (end > 0 && a[end - gap] > m) {a[end] = a[end - gap];end -= gap;}a[end] = m;}}
}

2. 交換排序

2.1 基本思想:

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

2.2?冒泡排序

左邊大于右邊交換,一趟排下來最大的在右邊

特性總結:
  1. 冒泡排序是一種非常容易理解的排序
  2. 時間復雜度:O(N^2)
  3. 空間復雜度:O(1)
  4. 穩定性:穩定
代碼實現:
void BubbleSort(int* a, int n) {for (int i = 0; i < n; i++) {int k = 1;for (int j = 0; j < n-i-1; j++) {if (a[j] > a[j + 1]) {k = 0;int x = a[j];a[j] = a[j + 1];a[j + 1] = x;}}if (k) {break;}}
}
2.3 快速排序

快速排序較為復雜,想了解請點擊-----》快速排序

3.選擇排序

3.1 基本思想:

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

3.2 直接選擇排序
步驟思路:
  • 在元素array[i]--array[n-1]中選擇關鍵碼最小(或最大)的數據元素
  • 若它不是這組元素中最后一個(第一個)元素,則將它與這組元素中的最后一個(第一個)元素交換
  • 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重復上述步驟,直到集合剩余1個元素
動圖演示:?

特性總結:
  1. 思路很好理解,但效率不好,實際很少應用,主要具有教學意義
  2. 時間復雜度:O(N^2)
  3. 空間復雜度:O(1)
  4. 穩定性:不穩定
代碼實現:
void SelectSort(int* a, int n) {for (int i = 0; i < n; i++) {int min = n - 1;for (int j = i; j < n; j++) {if (a[min] > a[j]) {min = j;}}swap(&a[min], &a[i]);}
}
3.3 堆排序

堆排序(HeapSort)是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種。它是通過堆來進行選擇數據,利用堆中某個節點的值總是不大于或不小于其父節點的值的特性。注意:升序建大堆,降序建小堆

代碼實現:
void AdjustDwon(int* a, int n, int root) {int i = 2 * root + 1;if (i < n - 1 && a[i] < a[i + 1]) {i++;}if (i < n && a[root] < a[i]) {swap(&a[root], &a[i]);AdjustDwon(a, n, i);}
}
void HeapSort(int* a, int n) {
//建堆for (int i = (n - 1 - 1) / 2; i >= 0; i--) {AdjustDwon(a, n, i);}while (n>1) {swap(&a[0], &a[n-1]);n--;AdjustDwon(a, n, 0);}
}

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

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

相關文章

AI大模型如何賦能智能座艙

AI 大模型如何賦能智能座艙 從上海車展上&#xff0c;我們看到由于智能座艙配置性價比較高&#xff0c;已經成為車企的核心競爭點之一&#xff0c;隨著座艙硬件規模化裝車&#xff0c;蔚小理、嵐圖、極狐等新勢力開始注重座艙多模態交互&#xff0c;通過集成語音/手勢/觸控打造…

Leetcode—2769. 找出最大的可達成數字【簡單】

2024每日刷題&#xff08;139&#xff09; Leetcode—2769. 找出最大的可達成數字 實現代碼 class Solution { public:int theMaximumAchievableX(int num, int t) {return num t * 2;} };運行結果 之后我會持續更新&#xff0c;如果喜歡我的文章&#xff0c;請記得一鍵三連…

【實戰】SpringBoot整合Websocket、Redis實現Websocket集群負載均衡

文章目錄 前言技術積累什么是Websocket什么是Redis發布訂閱Redis發布訂閱與消息隊列的區別 實戰演示SpringBoot整合WebsoketWebsoket集群負載均衡 實戰測試IDEA啟動兩臺服務端配置nginx負載均衡瀏覽器訪問模擬對話 前言 相信很多同學都用過websocket來實現服務端主動向客戶端推…

【知識蒸餾】deeplabv3 logit-based 知識蒸餾實戰,對剪枝的模型進行蒸餾訓練

本文將對【模型剪枝】基于DepGraph(依賴圖)完成復雜模型的一鍵剪枝 文章中剪枝的模型進行蒸餾訓練 一、邏輯蒸餾步驟 加載教師模型定義蒸餾loss計算蒸餾loss正常訓練 二、代碼 1、加載教師模型 教師模型使用未進行剪枝&#xff0c;并且已經訓練好的原始模型。 teacher_mod…

利用Python去除PDF水印

摘要 本文介紹了如何使用 Python 中的 PyMuPDF 和 OpenCV 庫來從 PDF 文件中移除水印&#xff0c;并將每個頁面保存為圖像文件的方法。我們將深入探討代碼背后的工作原理&#xff0c;并提供一個簡單的使用示例。 導言 簡介&#xff1a;水印在許多 PDF 文件中都很常見&#x…

全國數據庫管理系統設計賽-人大金倉內核實訓安排正式發布

作為數據庫領域國家隊&#xff0c;人大金倉積極響應國家戰略&#xff0c;通過賽題設計、內核技術支撐及賽前培訓等多方面&#xff0c;大力支持全國大學生計算機系統能力大賽-數據庫管理系統設計大賽成功舉辦。目前第二屆全國大賽正在火熱報名中&#xff0c;各種獎項等你來拿&am…

《web應用設計》第八次作業

我的小組長是姚若希&#xff0c;我們組課程設計的題目是&#xff1a;學生管理系統 &#xff0c;我認領的功能模塊是&#xff1a;課程管理 2.查詢并分頁

Html5 + Css3筆記詳細匯總大全

Html5 + Css3知識點Gitee地址 html5css3知識點: 尚硅谷—HTML5+CSS3知識點 介紹 屬性 屬性:在標簽中(開始標簽或自結束標簽)還可以設置屬性 屬性是一個名值對(x=y) 屬性用來設置標簽中的內容如何顯示 屬性和標簽名或其它屬性應該使用空格隔開 屬性名不能瞎寫,應該根據文…

只需三步,即可配置HTTPS跳轉

HTTPS&#xff08;全稱&#xff1a;Hyper Text Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;是以安全為目標的HTTP通道&#xff0c;簡單講是HTTP的安全版。通過SSL/TLS協議對數據進行加密&#xff0c;保證了數據傳輸的安全&#xff0c;防止數據被截獲、…

UWB論文:Introduction to Impulse Radio UWB Seamless Access Systems(2):脈沖;超寬帶;測距;定位

3) 測距/接收器 像全球定位系統&#xff08;GPS&#xff09;這樣的系統依賴于單向測距One Way Ranging&#xff08;OWR&#xff09;&#xff0c;其中多個衛星&#xff08;代表固定節點&#xff0c;稱為錨點anchors&#xff09;定期傳輸同步的無線電數據包集合&#xff0c;這允許…

sh控制臺輸入文字多行 按“# ? ?”結束

如果在Unix shell中輸入多行文字&#xff0c;那么這樣操作&#xff1a; 1. 打開您的終端&#xff08;Terminal&#xff09;。 2. 輸入您的文字&#xff0c;每行文字后按回車鍵。 3. 當您完成輸入所有文字后&#xff0c;輸入“# ? ?”然后按回車鍵&#xff0c;表示輸入結束。…

將Surface的分辨率減半以省電(二合一本\筆記本電腦適用)

【完全自定義分辨率教程】這篇教程用于將Surface之類的高分屏&#xff08;高分辨率&#xff09;的二合一本或筆記本等的分辨率調整為原來的一半&#xff0c;以實現省電等目的。 下載CRU&#xff08;Custom Resolution Utility&#xff09;解壓后&#xff0c;打開CRU.exe選擇當…

Java期末復習指南(1):知識點總結+思維導圖,考試速成!

&#x1f516;面向對象 &#x1f4d6; Java作為面向對象的編程語言&#xff0c;我們首先必須要了解類和對象的概念&#xff0c;本章的所有內容和知識都是圍繞類和對象展開的&#xff01; ? 思維導圖1 ? 類和對象的概念 ? 簡單來說&#xff0c;類就是對具有相同特征的一類事…

(全面)Nginx格式化插件,Nginx生產工具,Nginx常用命令

目錄 &#x1f3ab; 前言 &#x1f389; 開篇福利 &#x1f381; 開篇福利 x2 Double happiness # 介紹 # 地址 # 下載 &#x1f4bb; 命令及解析 # 整個文件系統中搜索名為nginx.conf的文件 # 編輯nginx.conf文件 # 重新加載配置文件 # 快速查找nginx.conf文件并使…

建筑施工突發事故應急處置vr安全培訓平臺

在不斷發展的時代背景下&#xff0c;掌握必要的應急安全知識已成為我們生活中不可或缺的一部分。由央企攜手我們華銳推出的3D線上應急宣教虛擬體驗館&#xff0c;標志著民眾應急安全教育的全新里程碑&#xff0c;不僅突破了傳統學習模式的局限&#xff0c;還讓每個人都能在靈活…

防火墻技術基礎篇:基于IP地址的轉發策略

防火墻技術基礎篇&#xff1a;基于IP地址的轉發策略的應用場景及實現 什么是基于IP地址的轉發策略&#xff1f; 基于IP地址的轉發策略是一種網絡管理方法&#xff0c;它允許根據目標IP地址來選擇數據包的轉發路徑。這種策略比傳統的基于目的地地址的路由更靈活&#xff0c;因…

深度學習之Python+OpenCV+Tensorflow實時人體檢測和計數

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 深度學習之PythonOpenCVTensorflow實時人體檢測和計數項目簡介 一、項目背景與意義 隨著科技的不斷發展&#xff…

Java - JsonPath 特殊場景解決方案

我們先看下JSONPath的使用&#xff0c;這里使用的是 GitHub - json-path/JsonPath: Java JsonPath implementation&#xff0c;其README中已經提供了相關的介紹和使用示例&#xff0c;這里再簡單介紹下&#xff0c;我們這里直接使用其中的示例數據。 {"store": {&quo…

macOS 安裝a d b

brew install android-platform-tools