排序---插入排序

基本思想

? ? ? ? 對于插入排序而言,它的基本思想就是往已經排好序的序列里邊插入數據。思想類似于玩撲克牌。接下來的排序都是基于下邊的這個數組。

int a[ ] = { 5 , 3 , 9 , 6 , 2 , 4 , 7 , 1 , 8 };

直接插入排序

? ? ? ? 我們想要將這個數組排成升序,在最一開始,我們可以認為數組的第一個元素5為一個有序的序列,5之后的元素就是一個個要往5這個有序的序列里邊插入的元素。

????????3顯然比5要小,要想排成升序,那么5就要移動到3的位置,3插入到5原來的位置。接下來的操作其實也是這樣的。

????????為了完成上邊的操作,我們需要一個變量tmp去存儲要插入的數據,我們還需要變量end去標記有序序列里邊的最后一個元素,那么end + 1就表示的是待排序序列里邊的第一個元素。

? ? ? ? 有了上邊的鋪墊,代碼的基本思路就出來了。拿end + 1位置的元素先給給tmp,接著拿end位置的元素與tmp做比較。如果arr[end] > tmp,就直接把arr[end + 1] = arr[end],可是到這,tmp依舊沒有到它該去的有序的位置,所以end--,此時再重復上邊的過程,直到arr[end] < tmp,這時候把arr[end?+ 1] = tmp。

? ? ? ? 順著上邊的思路,大家再結合我下邊的圖片理解。

? ? ? ? 具體代碼

//直接插入排序
void InsertSort(int* arr, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = arr[end + 1];while (end >= 0){if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}else{break;}}arr[end + 1] = tmp;}
}

? ? ? ? 從具體的代碼里邊還需要注意幾點,一方面是arr[end] < tmp的時候,將arr[end + 1] = tmp,另一方面,如果tmp的大小比有序序列里邊都小,那么tmp這時候其實是去的0下標的位置,此時end < 0,所以統一把arr[end + 1] = tmp寫在循環外邊。還有最外邊的那個for循環,i < n - 1,因為如果i == n的時候,end + 1已經越界了。

直接插入排序的時間復雜度

? ? ? ? 直接插入排序是由兩個循環嵌套而成的,最終的時間復雜度可以理解為最深層那行代碼執行的次數,假設if條件永遠成立,這是最壞的情況。可以畫個大概的表格來理解。

end = i?????????執行次數

??????0? ? ? ? ?? ? ? 1

??????1? ? ? ? ? ? ? ?2

??????2? ? ? ? ? ? ? ?3

??????.? ? ? ? ? ? ? ? .

??????.? ? ? ? ? ? ? ? .

??????.? ? ? ? ? ? ? ? .

? ? n - 2? ? ? ? ? n - 1

? ? ? ? 最后用等差數列求和一下,然后按照大0表示法的條件,得出時間復雜度最差的情況為0(N^2)。當大的數據全在前邊,小的數據全在后邊才能滿足這一個情況。但如果這個數組有序(小的元素都在前邊,大的數據都在后邊),那么時間復雜度就降為0(N)了。

? ? ? ? 為了滿足每次待排序的序列都可以滿足小的數據大都在前邊,大的數據大都在后邊,我們就需要采取一些優化的手段,希爾排序可以幫助我們。

希爾排序

? ? ? ? 希爾排序是直接插入排序的優化版本,它的基本思想就是將待排序序列先分組,組內先排序,最后大致滿足小的數據在前,大的數據在后了之后,再進行直接插入排序。

? ? ? ? 希爾排序法又叫縮小增量法,具體的實現就是先選定?個整數(通常是gap = n/3+1),把待排序序列所有記錄分成各組,所有的距離相等的記錄分在同?組內,并對每?組內的記錄進?排序,然后gap=gap/3+1得到下?個整數,再將數組分成各組,進?插?排序,當gap=1時,就相當于直接插?排序。gap為幾,就分為幾組。

? ? ? ? 這就是完整的分組情況。

? ? ? ? 就拿gap == 2來具體說明。

? ? ? ? 很直觀的可以看出,經過了兩次分組,并且組內排序之后,元素變成了我們最希望看到的樣字,小的全在前邊,大的都在后邊。

? ? ? ? 我們稱gap > 1為預排序,而gao == 1就為直接插入排序。這是一個優化的過程,本質還是直接插入排序,整體代碼變化不大。

????????代碼實現

//希爾排序
void ShellSort(int* arr, int n)
{int gap = n;while(gap > 1)//gap > 1都是預排序{gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++){int end = i;int tmp = arr[end + gap];while (end >= 0){if (arr[end] > tmp){arr[end + gap] = arr[end];end = end - gap;}else{break;}}arr[end + gap] = tmp;}}
}

? ? ? ? 對于最外層的while循環來說很好理解,因為循環里邊都是在進行預排序,所以要滿足gap > 1,除去for循環的循環條件不看,其他的代碼就是直接插入排序一樣的代碼,只不過是元素之間的距離變成了gap,對于for循環來說,為什么要i?< n - gap,是因為我們簡化了代碼,如果真的按照一組組去進行排序的話,就要再多嵌套了個循環了,這顯然不合適,所以我們就對各組同時進行直接插入排序。

? ? ? ? 還是拿gap == 2為例子(上邊有圖),gap為2的時候總共分為兩組,i = 0的時候進入for循環就是在對紅色組進行排序,排序完,i++,再進入for循環,就是在對綠色組進行排序,以此類推,又由于每組之間的元素相差gap,所以當end == n - gap的時候已經是在最后一個元素的位置,再往下end + gap就越界了。

希爾排序的時間復雜度

? ? ? ? 希爾排序的復雜度是算不出來的,官方的給出的大致復雜度是0(N^1.3),可見是比直接插入排序優化了不少。

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

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

相關文章

Java性能優化實戰(四):IO與網絡優化的4個關鍵方向

IO與網絡操作是Java應用性能的常見瓶頸&#xff0c;尤其在高并發場景下&#xff0c;低效的IO處理會導致響應緩慢、資源浪費等問題。本文將聚焦IO與網絡優化的四個核心方向&#xff0c;通過真實案例、代碼對比和性能數據&#xff0c;詳解如何提升IO效率、減少網絡傳輸開銷&#…

對齊Wireshark和USRP捕獲信號的波形

一、USRP信號 USRP捕獲信號的波形如下&#xff1a; 放大后&#xff1a; 100ms 10ms 1ms 100us 10us 1us 二、波形分析 2.1 時間分辨率 采樣率61.44MHz, 對應時間分辨率為1/61.44us0.01627us16.27ns。 這時間分辨率夠用了&#xff0c;數據包長度為1到20us&#xff1a; 2.2 W…

2025年加密軟件技術深度分析:從原理到企業級應用實踐

一、加密技術基礎與分類加密技術作為信息安全的核心基石&#xff0c;其基本原理是通過特定算法將明文數據轉換為不可讀的密文&#xff0c;只有持有正確密鑰的授權用戶才能解密還原。2025年主流的加密技術可分為三大類&#xff1a;?對稱加密?&#xff1a;使用相同密鑰進行加密…

打工人日報20250822

打工人日報20250822 對自己負責&#xff0c;可以是換一個角度看待自己不喜歡的工作&#xff0c;轉換一個角度&#xff0c;從中找到自己感興趣的點 真的非常不想計算聲場的數據 啊啊啊啊啊 技術 STM32燒錄問題 STM32 代碼燒錄失敗&#xff1a;Error: Flash Download failed …

消費盲返模式:重構快消行業營銷生態的破局之道與風險防控指南

一、模式爆發&#xff1a;快消行業的新增長引擎在流量成本攀升、用戶留存困難的商業環境下&#xff0c;消費盲返模式正成為零售領域的一匹黑馬。其核心邏輯在于通過"消費即投資"的機制設計&#xff0c;將每筆交易轉化為后續100筆訂單的激勵源&#xff0c;形成獨特的&…

STM32-FreeRTOS快速入門指南(上)

第一章 FreeRTOS系統配置 1. FreeRTOSConfig.h文件 針對 FreeRTOSConfig.h 文件&#xff0c;在 FreeRTOS 官方的在線文檔中有詳細的說明&#xff0c;網址為&#xff1a; https://www.freertos.org/a00110.html FreeRTOS 使用 FreeRTOSConfig.h 文件進行配置和裁剪。 FreeRTOSCo…

南溪智融雙碳示范基地建筑設備管理系統 + 智能照明系統調試完成:筑牢 “綠色智能” 運營基石

南溪智融雙碳示范基地作為聚焦 “雙碳” 目標的標桿項目&#xff0c;其建筑設備管理系統與智能照明系統的調試完成&#xff0c;標志著基地在 “設備高效運維、能源精準管控、低碳場景落地” 方面邁出關鍵一步。兩大系統深度契合示范基地 “以技術賦能雙碳” 的核心定位&#xf…

c++的可擴展性方法

在C編碼中&#xff0c;"方便擴展"通常指的是代碼設計具有良好的**可維護性、可重用性和靈活性**&#xff0c;能夠在不修改原有代碼或僅少量修改的情況下&#xff0c;輕松添加新功能、支持新類型或適應新需求。以下是一些典型的、體現“方便擴展”思想的C編程案例&…

加速車輛開發 風丘道路載荷數據采集 (RLDA) 測試方案

一、背景 整車廠在汽車上市前&#xff0c;了解產品所能承受的載荷是非常重要的&#xff0c;因此需進行道路載荷數據采集&#xff08;RLDA&#xff09;測試。通過獲得車輛在實際試驗場或公路道路中行駛的載荷信息來為整車臺架道路模擬試驗提供目標信號輸入&#xff0c;以及為用于…

大模型0基礎開發入門與實踐:第4章 “腦細胞”的模擬:神經網絡與深度學習入門

第4章 “腦細胞”的模擬&#xff1a;神經網絡與深度學習入門 1. 引言 在上一章&#xff0c;我們像一位偵探&#xff0c;學會了使用決策樹這樣的工具&#xff0c;從清晰的線索&#xff08;花瓣、花萼的尺寸&#xff09;中推理出確定的結論&#xff08;鳶尾花的種類&#xff09;。…

微服務之間的調用關系如何處理,才能防止循環依賴

在微服務架構中&#xff0c;循環依賴是常見的設計問題&#xff0c;可能導致系統部署失敗、啟動順序沖突、故障排查困難等問題。處理循環依賴的核心原則是通過架構設計打破依賴閉環&#xff0c;以下是具體的解決方案&#xff1a; 1. 重新劃分服務邊界&#xff08;根本解決&#…

粗糧廠的基于flink的汽車實時數倉解決方案

基于flink的實時數倉解決方案1 背景2 業務模型1 業務框架2 難點痛點3技術選型1 計算引擎2 中間存儲3 查詢引擎4 flink計算架構設計1 純實時架構2 純實時定期補充離線數據3 純實時定期刷新過期binlog4 lamdba 分字段更新 歷史過期數據刷新5 痛點解決delta joinmerge-enginehol…

Datawhale AI夏令營---coze空間共學

1.進入coze空間 2.點擊免費使用 3.點擊制作播客&#xff0c;微信上面選好鏈接 徹底搞懂深度學習-模型訓練和推理&#xff08;動圖講解&#xff09; 4.運行過程 5.音頻鏈接 https://lf-bot-studio-plugin-resource.coze.cn/obj/bot-studio-platform-plugin-tos/sami_podcast…

遙感機器學習入門實戰教程|Sklearn案例⑥:網格搜索與超參數優化

在前幾篇案例中&#xff0c;有同學在后臺留言&#xff1a;“模型的參數到底怎么調&#xff1f;比如 SVM 的 C 和 γ&#xff0c;隨機森林的樹數和深度&#xff0c;要怎么選才能得到最優結果呢&#xff1f;”這是一個非常經典的問題&#xff1a;參數選不好&#xff0c;模型效果差…

論文精讀(三)|智能合約漏洞檢測技術綜述

筆者鏈接&#xff1a;撲克中的黑桃A 專欄鏈接&#xff1a;論文精讀 本文關鍵詞&#xff1a;智能合約;合約安全;合約可靠性;合約質量保障;漏洞檢測;合約程序分析 引 諸位技術同仁&#xff1a; 本系列將系統精讀的方式&#xff0c;深入剖析計算機科學頂級期刊/會議論文&#…

YOLO --- YOLO11模型以及項目詳解

YOLO — YOLO11模型以及項目詳解 文章目錄YOLO --- YOLO11模型以及項目詳解一&#xff0c;開源地址二&#xff0c;重要模塊2.1 C3K22.2 C2PSA2.3 檢測頭三&#xff0c;網絡結構3.1 整體結構劃分3.2 Backbone 結構分析&#xff08;從下往上看&#xff09;3.3 結構分析&#xff0…

Debezium監聽MySQL binlog并實現有狀態重啟

Debezium實現MySQL數據監聽了解Debezium? 本期主要內容實現步驟1. 新建Maven工程2.導入依賴3.核心代碼編寫4.offset的存儲5.OffsetBackingStore實現jdbc模式6.運行結果總結了解Debezium 官網&#xff1a;https://debezium.io/ Debezium是一組分布式服務&#xff0c;用于捕獲數…

InfluxDB 存儲優化:TSM 文件管理與空間回收(一)

一、InfluxDB 與 TSM 文件初相識**在數字化時代&#xff0c;數據量呈爆發式增長&#xff0c;尤其是時間序列數據&#xff0c;如服務器監控指標、傳感器讀數、金融交易記錄等&#xff0c;它們都帶有時間戳&#xff0c;記錄著事物隨時間的變化。InfluxDB 作為一款高性能的開源時序…

macos使用FFmpeg與SDL解碼并播放H.265視頻

效果: 安裝依賴: brew install ffmpeg brew install sdl2 brew install x265 確認x265已啟用 查看x265版本 工程CMakeLists.txt

C#開源庫ACadSharp讀取dwg圖元的示例

文章目錄介紹數據示例讀取圖元屬性介紹 開源庫ACadSharp的地址&#xff1a;https://github.com/DomCR/ACadSharp 可以在NuGet中搜索到該庫并安裝。 數據示例 數據是一個繪制了以下簡單圖元的dwg數據&#xff1a; 讀取圖元屬性 創建了.net6控制臺項目&#xff0c;通過NuG…