【數據結構】排序(一)—— 希爾排序(思路演進版)

目錄

一、常見的排序算法分類

二、常見排序算法的實現?

2.1插入排序

2.1.1基本思想

2.1.2直接插入排序

思路

step1.單趟控制

step2.總體控制?

代碼實現

測試

特性總結

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

基本思想

思路演進

🌈1.代碼實現單組排序(以紅色組為例)

🌈2.加入控制多組排序的代碼

🌈3.對上面代碼修改 ,一組一組排 改為 多組并排!!!

🌈4.最后考慮,如何控制gap?

最終代碼實現

測試

特性總結

三、結語


一、常見的排序算法分類

二、常見排序算法的實現?

2.1插入排序

2.1.1基本思想

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

把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的記錄插入完為 止,得到一個新的有序序列 。

?2.1.2直接插入排序

思路
step1.單趟控制

先考慮單趟排序,暫時不考慮區間到底是從哪到哪 ,先抽象為[0,end]

假設[0,end]是有序的區間 a[end+1] 插入到?[0,end]中

?具體如何插入:

下標是end+1的元素依次跟[0,end]區間中的元素作比較:

end+1先跟end比 再跟 end-1比較......依次往下

如果a[end+1]<a[end] 以排升序為例子 ,那么a[end]就往后挪動 也就是往后覆蓋

如果a[end+1]>a[end] ,那么就停止比較 ,a[end+1] 插入到?[0,end]中

?思路落實到代碼:

用臨時變量tmp 先保存a[end+1],最終插入的位置也是a[end+1]

step2.總體控制?

接下來考慮如何控制[0,end]區間大小的變化:

?執行過程描述:

初始時 區間元素個數肯定只有一個,

也就是end =?0 ,區間[0,0]有序,只有一個元素a[0],然后a[1]往里插入,

完成后,end = 1,區間[0,1]有序,有兩個元素,a[2]往里插入...

直到整個數組元素都有序,排序完成。

?思路落實到代碼:

執行過程中,我們發現,end的值不斷變化的,所以加入外層循環變量i控制即可!

代碼實現
void InsertSort(int* a, int n)
{//外層循環 控制 多趟[0,end]for (int i = 0; i < n-1; i++){//單趟//[0,end] end+1 插入 [0,end]int end = i;int tmp = a[end + 1];while (end >= 0){//升序if (tmp < a[end]){//end 往后覆蓋 end+1a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}
測試

特性總結

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

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

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

4. 穩定性:穩定

?2.1.3 希爾排序( 縮小增量排序 )

基本思想

希爾排序法又稱縮小增量法。希爾排序法的基本思想是:

先選定一個整數gap,把待排序文件中所有記錄分成多個組,所有距離為gap的記錄分在同一組內,并對每一組內的記錄進行排序。然后,再往后依次取 間隔為gap的記錄,重復上述分組和排序的工作。當gap==1時,所有記錄在統一組內排好序。

思路演進

總體思路:

1、預排序:分別對每個分組進行插入排序

2、直接插入排序 :保證最終結果是有序的

先選定一個整數 ,先假設 gap = 3.? 圖解

🌈1.代碼實現單組排序(以紅色組為例)

🌈2.加入控制多組排序的代碼

總體有gap組 排完紅色組 接著排 藍色組、綠色組 則需要再加入一層循環控制

j==0 紅色組 插入排序

j==1?藍色組 插入排序

j==2?綠色組 插入排序

🌈3.對上面代碼修改 ,一組一組排 改為 多組并排!!!

上面代碼是 :?紅色組排完 排綠色組? 綠色排完 排藍色組

下面代碼是 :?紅色組第一個位置排好,

? ? ? ? ? ? ? ? ? ? ? ? i++ 排藍色組第一個位置 ,

? ? ? ? ? ? ? ? ? ? ? ?再 i++ 排綠色組第一個位置

? ? ? ? ? ? ? ? ? ? ? ?以此類推......

?實現多組并排:

🌈4.最后考慮,如何控制gap?

gap越大:小的值更快調到前面,大的值更快調到后面

gap越小:調得越慢 但 越接近有序

gap==1 :就是直接插入排序

所以我們再加入一層循環 控制gap

最終代碼實現
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){gap = gap / 2 ;for (int i = 0; i < n - gap; i ++){//單趟//[0,end] end+gap 插入 [0,end]int end = i;int tmp = a[end + gap];while (end >= 0){//升序if (tmp < a[end]){//end 往后覆蓋a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}
測試

特性總結

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

2. 當gap > 1時都是預排序,目的是讓數組接近于有序

? ? 當gap == 1時,數組已經是接近有序,再進行直接插入排序,目的是讓數組有序

? ? 這樣整體而言,可以達到優化的效果。我們實現后可以進行性能測試的對比。

3. 希爾排序的時間復雜度不好計算,因為gap的取值方法很多,導致很難去計算,因此在好些樹中給出的希爾排序的時間復雜度都不固定。平均時間復雜度O(N^1.3)

三、結語

插入排序就先講到這里,后面滴選擇、交換、歸并排序,都會快快更新滴~

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

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

相關文章

你能堅持二十年如一日地積極試錯嗎?

你能堅持二十年如一日地積極試錯嗎&#xff1f;先說一個大家都耳熟能詳的人物&#xff1a;克里斯托弗哥倫布&#xff0c;他被稱為新大陸的發現者&#xff0c;是具有極高歷史地位的偉大航海家。 但是新大陸本來就不是所謂的“新”大陸&#xff0c;而是在4萬年前從白令海峽遷徙過…

端午節線上活動方案怎么寫?

一年一端午&#xff0c;一歲一安康。 如果您想組織端午活動&#xff0c;卻不知道如何安排&#xff0c;可以看看何策網&#xff0c;有很多案例參考&#xff0c;仿造模板修改即可。 下面分享一個線上端午節活動策劃方案&#xff0c;希望能幫到你&#xff01; 端午節作為祭祖祈…

Qt 實現TCP 協議的斷開重連

在Qt中實現TCP斷開重連&#xff0c;你可以使用QTcpSocket類&#xff0c;并結合QTimer來處理重連邏輯&#xff0c;在Qt中實現TCP斷開后的自動重連功能&#xff0c;通常可以通過以下步驟進行&#xff1a; 1. 初始化QTcpSocket&#xff1a; 首先&#xff0c;需要創建一個QTcpSock…

Docker使用注意事項

docker import 和 docker load 有什么區別&#xff1f; 想要了解 docker load 與 docker import 命令的區別&#xff0c;還必須知道 docker save 與 docker export docker save&#xff1a;將一個鏡像導出為文件&#xff0c;再使用docker load命令將文件導入為一個鏡像&#…

mysql集群NDBcluster引擎在寫入數據時報錯 (1114, “The table ‘ads‘ is full“)

問題描述&#xff1a;mysql集群在寫入數據時&#xff0c;出現上述報錯 問題原因&#xff1a;表數據已滿&#xff0c;一般是在集群的管理節點設置里面datamemory的值太小&#xff0c;當數據量超過該值時就會出現該問題 解決方案&#xff1a; 修改集群管理節點的config.ini里面…

ICode國際青少年編程競賽- Python-4級訓練場-嵌套for循環練習2

ICode國際青少年編程競賽- Python-4級訓練場-嵌套for循環練習2 1、 for i in range(3):Dev.turnRight()for j in range(3):Dev.step(-3)Dev.turnRight()Dev.step(4-2*i)2、 for i in range(6):for j in range(2):Dev.step(2 2 * i)if i > 3: Dev.step(i - 2)Dev.turnRi…

更相減損術求最大公約數

1.定義 更相減損術是出自《九章算術》的一種求最大公約數的算法&#xff0c;它原本是為約分而設計的&#xff0c;但它適用于任何需要求最大公約數的場合。 原文是&#xff1a; 可半者半之&#xff0c;不可半者&#xff0c;副置分母、子之數&#xff0c;以少減多&#xff0c;…

C++小程序:同一路由器下兩臺計算機間簡單通信(2/2)——客戶端

客戶端的程序結構前半部分與服務器端基本相同&#xff0c;后半部分也相對簡單。相關函數的解釋可以參考前文服務器端的內容。有關客戶端的內容除個別地方外&#xff0c;就不再做長篇大論的解釋。強調一點&#xff0c;如果將此程序移到其它電腦上運行&#xff0c;編譯需要releas…

Ciphey無法安裝的解決辦法

安裝過程純屬自己實踐&#xff0c;滿滿干貨 困擾我幾天的問題終于解決了 我看著教程在window上安裝 python3.8/python3.9/python3.10無論如何都安裝不上&#xff0c; 在win10虛擬機仍然安裝不上 可能是我電腦環境問題 解決辦法&#xff1a; 在kali中安裝&#xff0c;但是…

18_文件系統的制作-Ramdisk

文件系統的制作(Ramdisk) 本文介紹如何制作文件系統。另外, 由于Busybox 集合了很多工具,編譯起來也非常方便。在講解制作文件系統的時候,也會介紹 busybox 的編譯和安裝過程;介紹制作文件系統時,會詳細介紹 Ramdisk 、 YAFFS2、JFFS2 及其它文件系統的制作。 1. 根文件系…

列表、字典、集合推導式

文章目錄 前言1.列表推導式&#xff08;List Comprehension&#xff09;:2 字典推導式&#xff08;Dictionary Comprehension&#xff09;3 集合推導式&#xff08;Set Comprehension) 前言 在Python中&#xff0c;列表、字典、集合推導式是一種便捷的語法&#xff0c;用于根據…

第13節 第二種shellcode編寫實戰(2)

在第二種shellcode編寫實戰(1)的基礎上&#xff0c;新增加一個CAPI類&#xff0c;將所有用到的函數都在這個類中做動態調用的處理&#xff0c;這樣使得整個shellcode功能結構更加清晰。 1. 新建類CAPI&#xff08;即api.h和api.cpp兩個文件&#xff09;&#xff1a; api.h&…

#DELPHI BASS庫Windows平臺下,實時更換輸出設備

DELPHI BASS庫Windows平臺下&#xff0c;實時更換輸出設備 #DELPHI BASS庫Windows平臺下&#xff0c;實時更換輸出設備 取自網絡&#xff0c;分享&#xff0c;項目嵌入無損音樂播放后&#xff0c;畫蛇添足的功能分享&#xff01; 直接貼核心代碼&#xff0c;看不明白去看說…

flutter自定義日期選擇器按日、按月、自定義開始、結束時間

導入包flutter_datetime_picker: 1.5.0 封裝 import package:atui/jade/utils/JadeColors.dart; import package:flutter/cupertino.dart; import package:flutter/material.dart; import package:flutter_datetime_picker/flutter_datetime_picker.dart; import package:flut…

景源暢信電商:經營抖店需要電腦嗎?

經營抖店是否需要電腦?這個問題看似簡單&#xff0c;實則關乎著商家的運營效率和成本投入。在當前數字化、網絡化的商業環境中&#xff0c;電腦已經成為了不可或缺的工具。那么&#xff0c;經營抖店究竟是否需要電腦呢?答案是肯定的。 一、高效處理訂單 電腦能夠高效地處理大…

Mysql FLOAT和DOUBLE類型區別

存儲方式&#xff1a; FLOAT和DOUBLE是浮點數類型&#xff0c;它們以二進制格式存儲數值&#xff0c;可以存儲近似值。這意味著某些特定的小數值可能無法精確表示&#xff0c;可能會有微小的計算誤差。DECIMAL是定點數類型&#xff0c;以字符串形式存儲數值&#xff0c;可以存儲…

從零學算法2105

2105. 給植物澆水 II Alice 和 Bob 打算給花園里的 n 株植物澆水。植物排成一行&#xff0c;從左到右進行標記&#xff0c;編號從 0 到 n - 1 。其中&#xff0c;第 i 株植物的位置是 x i 。 每一株植物都需要澆特定量的水。Alice 和 Bob 每人有一個水罐&#xff0c;最初是滿的…

如何在湖師大官網找到考研真題

今天學弟問我怎么找真題&#xff0c;我必須告訴他怎么找湖師大的真題&#xff0c;身為考研學子&#xff0c;這是必須要知道滴&#xff0c;尤其是自命題&#xff0c;是吧&#xff0c;話不多說&#xff0c;言歸正傳&#xff0c;我們開始吧&#xff01; 1 打開湖師大官網 什么&a…

樹莓派nmap掃描

debian系統安裝nmap&#xff1a; sudo apt install nmap安裝nmap完成后&#xff0c;輸入 ip route 來查看當前Wi-Fi路由器的ip地址。 第一行的default via后顯示的便是網關地址&#xff0c;也就是路由器地址。 獲取到路由器ip地址后&#xff0c;在終端中輸入&#xff1a; …

一站式HMI軟件開發套件eStation,讓開發更簡單高效

4月份舉辦的北京國際車展上全球首發車117輛&#xff0c;新能源車型278個&#xff0c;越來越多的車廠通過差異化和改善UI/UE體驗&#xff0c;來獲取更多用戶的青睞。為快速響應差異化競爭需求&#xff0c;智能座艙HMI市場遇到以下挑戰&#xff1a; 如何兼容不同項目開發人員編程…