深入理解C語言:詳解直接插入排序的實現與優化

目錄

引言

一、直接插入排序的相關概念

1.1、基本概念

1.2、直接插入排序過程詳解

二、代碼實現

三、時間復雜度

四、希爾排序

4.1、希爾排序的陳述

4.2、代碼實現

4.3、時間復雜度

結語


引言

在計算機科學的世界里,排序算法是基礎且重要的組成部分。它們是組織和處理數據的核心工具,能夠讓數據更易于檢索、分析和理解。今天,我們將一同探討一種簡單而經典的排序算法——直接插入排序。 尤其對于初學者來說,理解直接插入排序的原理和實現,能夠幫助你更好地掌握C語言的編程技巧,并為后續學習更復雜的排序算法奠定堅實的基礎。本文將結合C語言代碼實例,帶你深入理解直接插入排序的原理、實現方法,并探討其優缺點,讓你能夠輕松掌握這一基礎算法。

一、直接插入排序的相關概念

1.1、基本概念

直接插入排序是插入排序的一種,其核心思想是:把待排序的序列,按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中。

通過核心思想,我們了解到,直接插入排序的前提條件是有一個有序序列,那么,我們還沒進行直接插入排序,難道就需要利用其他算法先排序一遍嗎?當然不是,這里有個很隱晦的條件——單個元素也是有序序列!是不是感覺有點牽強,但是仔細想想,也確實是這樣的。

1.2、直接插入排序過程詳解

通俗點說,就是先找出一個有序序列(單個元素,一般用首元素),然后依次遍歷后面的元素,然后在看看后面的元素適合放在哪個位置,就放在哪個位置

那么,具體的操作應該怎樣呢?

首先,我們要創建兩個變量,end 存放元素的下標,tmp存放的是下標對應的元素,而且,tmp 存放的元素是 arr[end+1] ,如圖:

其次,判斷 end 指向的元素 與 tmp 存放的元素比大小,如果比 tmp 大了,則 end 的元素覆蓋 end+1的元素,如圖:

直到 end 小于0為止。目前截止,這只是第一個循環,結束后,要將tmp的元素放到 arr[end+1] 中。

從第二循環開始, end 就等于 1 了,然后等于3 ,一直到倒數第二元素結束。

在上面的動圖循環完成后,end 將會變成3 ,開始下一輪的操作。一直到倒數第二個元素為止,因為tmp始終比end大一 ,又不能讓tmp越界訪問。

二、代碼實現

void InsertSort(int* arr, int n)
{assert(arr);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;}
}

代碼這里正常寫就行了,注意end的停止范圍,不能讓tmp越界訪問哦!

三、時間復雜度

通過上面代碼,可以看到有兩個循環,而且結合過程,就知道它把序列遍歷了兩遍,所以時間復雜度為 O(N^2)? ,當然,最好的情況就是序列本來就是有序或者近似有序的,則時間復雜度就變為O(N)

四、希爾排序

前面提到,直接插入算法的時間復雜度為O(N^2) ,而只有在待排序列是有序的或者近似有序的時候,它的時間復雜度才能降為 O(N)。那么,有沒有什么辦法可以降低直接插入排序的時間復雜度呢?有的,那就是希爾排序

4.1、希爾排序的陳述

先選定一個整數,把帶待排序文件所有記錄分成各組,所有的距離相等的記錄分在同一組內,并對每一組內的記錄進行排序,然后 gap = gap/3 +1 得到下一個整數,再將序列分割成各組,進行插入排序。當 gap = 1時,就相當于直接插入排序

如圖,是 gap = 3 時的分組

將每組排完序后:

gap = 3/3 +1 = 2, 所以就是這樣分組的:

每組排好序后:

接下來的 gap = 2/3+1 = 1 ,也就是一個元素一組,相當于直接插入排序:

此刻再看,待排序序列已經成為一個近似有序序列,甚至是有序序列,這樣,時間復雜度只有O(N)!

4.2、代碼實現

void ShellSort(int* arr, int n)
{assert(arr);int gap = n;while (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 -= gap;}else{break;}}arr[end + gap] = tmp;}}
}

這里要提一嘴,分組時的插入排序算法和直接插入排序算法是一樣的,區別就在于,直接插入排序元素是一個挨著一個的,而分組元素中間有個 gap ,,把gap看成1就是直接插入排序了。因此,分組的排序只需要在直接排序算法的基礎上把1改為gap就行了。

4.3、時間復雜度

有大佬說過希爾排序的時間復雜度非常復雜,但最后還是給出了具體的值:O(N^1.3)。鄙人水平有限,這里就不推導了。

可以看到,希爾排序的時間復雜度比直接插入排序的時間復雜度要小的很多,從某種意義上說,希爾排序即是一種新的排序,也是直接插入排序的延伸和改進!

結語

恭喜你,你已經掌握了C語言插入排序算法的核心知識! 通過本文的學習,你不僅理解了直接插入排序的原理,還學會了用C語言實現它,并了解了它的優缺點。 掌握直接插入排序,是成為一名合格程序員的必經之路。希望你能夠將所學知識應用到實際項目中,不斷提升自己的編程能力。 記住,實踐是檢驗真理的唯一標準,多寫代碼,多思考,你就能在編程的世界里越走越遠! 祝你在編程的道路上越走越好!

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

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

相關文章

【DRAM存儲器五十五】LPDDR5介紹--command bus training

??個人主頁:highman110 ??作者簡介:一名硬件工程師,持續學習,不斷記錄,保持思考,輸出干貨內容 參考資料:《某LPDDR5數據手冊》 、《JESD209-5A》 在為高頻或中頻操作啟用ODT之前,必須對L

一道曾經百度面試題

&#x1f680;個人主頁&#xff1a;BabyZZの秘密日記 &#x1f4d6;收入專欄&#xff1a;C語言 &#x1f30d;文章目入1. 題目重現2. 大小端到底在比什么&#xff1f;3. 解法一&#xff1a;聯合體&#xff08;union&#xff09;為什么一行就夠&#xff1f;使用示例4. 解法二&am…

VIKOR(Multi-criteria Optimization and Compromise Solution)簡介與簡單示例

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…

【算法訓練營Day18】二叉樹part8

文章目錄修剪二叉搜索樹將有序數組轉換為二叉搜索樹把二叉搜索樹轉換為累加樹修剪二叉搜索樹 題目鏈接&#xff1a;669. 修剪二叉搜索樹 解題邏輯&#xff1a; 因為在刪除的同時要保證相對結構&#xff0c;所以我們不能沿用上一篇文章中的刪除邏輯&#xff0c;新的刪除邏輯為&…

【C++篇】“內存泄露”的寶藏手段:智能指針

目錄 智能指針的使用場景分析 RAII和智能指針的設計思路 C標準庫智能指針的使用 auto_ptr的使用&#xff1a; unique_ptr的使用&#xff1a; shared_ptr的使用&#xff1a; 模擬shared_ptr: 定制刪除器&#xff1a; shared_ptr的循環引用 weak_ptr 智能指針的使用場景…

【密碼學】4. 分組密碼

目錄分組密碼分組密碼概述Feistel 密碼結構數據加密標準&#xff08;DES&#xff09;差分密碼分析與線性密碼分析分組密碼的運行模式國際數據加密算法&#xff08;IDEA&#xff09;高級加密標準&#xff08;AES&#xff0c;Rijndael&#xff09;中國商用密碼 SM4祖沖之密碼&…

單片機(STM32-WIFI模塊)

一、WIFI模塊介紹 1. ESP12-F模組介紹 1.1 簡介 ESP12-F模組&#xff08;安信可&#xff08;Ai-Thinker&#xff09;ESP8266系列模組&#xff09;是一款基于樂鑫&#xff08;Espressif&#xff09;公司ESP8266芯片的Wi-Fi無線通信模塊&#xff0c;廣泛應用于物聯網&#xff0…

PyTorch 數據類型和使用

關于PyTorch的數據類型和使用的學習筆記 系統介紹了PyTorch的核心數據類型Tensor及其應用。Tensor作為多維矩陣數據容器&#xff0c;支持0-4維數據結構&#xff08;標量到批量圖像&#xff09;&#xff0c;并提供了多種數值類型&#xff08;float32/int64等&#xff09;。通過…

[python刷題模板] LogTrick

[python刷題模板] LogTrick 一、 算法&數據結構1. 描述2. 復雜度分析3. 常見應用4. 常用優化二、 模板代碼1. 特定或值的最短子數組2. 找特定值3. 找位置j的最后一次被誰更新4. 問某個或和的數量三、其他四、更多例題五、參考鏈接一、 算法&數據結構 1. 描述 LogTric…

Vim與VS Code

Vim is a clone, with additions, of Bill Joys vi text editor program for Unix. It was written by Bram Moolenaar based on source for a port of the Stevie editor to the Amiga and first released publicly in 1991.其實這個本身不是 IDE &#xff08;只有在加入和配置…

[2025CVPR-圖象分類方向]CATANet:用于輕量級圖像超分辨率的高效內容感知標記聚合

?1. 研究背景與動機? ?問題?&#xff1a;Transformer在圖像超分辨率&#xff08;SR&#xff09;中計算復雜度隨空間分辨率呈二次增長&#xff0c;現有方法&#xff08;如局部窗口、軸向條紋&#xff09;因內容無關性無法有效捕獲長距離依賴。?現有局限?&#xff1a; SPI…

課題學習筆記3——SBERT

1 引言在構建基于知識庫的問答系統時&#xff0c;"語義匹配" 是核心難題 —— 如何讓系統準確識別 "表述不同但含義相同" 的問題&#xff1f;比如用戶問 "對親人的期待是不是欲&#xff1f;"&#xff0c;系統能匹配到知識庫中 "追名逐利是欲…

在Word和WPS文字中把全角數字全部改為半角

大部分情況下我們在Word或WPS文字中使用的數字或標點符號都是半角&#xff0c;但是有時不小心按錯了快捷鍵或者點到了輸入法的全角半角切換圖標&#xff0c;就輸入了全角符號和數字。不用擔心&#xff0c;使用它們自帶的全角、半角轉換功能即可快速全部轉換回來。一、為什么會輸…

數據結構的基本知識

一、集合框架1、什么是集合框架Java集合框架(Java Collection Framework),又被稱為容器(container),是定義在java.util包下的一組接口(interfaces)和其實現類(classes).主要表現為把多個元素(element)放在一個單元中,用于對這些元素進行快速、便捷的存儲&#xff08;store&…

WebStack-Hugo | 一個靜態響應式導航主題

WebStack-Hugo | 一個靜態響應式導航主題 #10 shenweiyan announced in 1.3-折騰 WebStack-Hugo | 一個靜態響應式導航主題#10 ?編輯shenweiyan on Oct 23, 2023 6 comments 7 replies Return to top shenweiyan on Oct 23, 2023 Maintainer Via&#xff1a;我給自己…

01 基于sklearn的機械學習-機械學習的分類、sklearn的安裝、sklearn數據集、數據集的劃分、特征工程中特征提取與無量綱化

文章目錄機械學習機械學習分類1. 監督學習2. 半監督學習3. 無監督學習4. 強化學習機械學習的項目開發步驟scikit-learn1 scikit-learn安裝2 sklearn數據集1. sklearn 玩具數據集鳶尾花數據集糖尿病數據集葡萄酒數據集2. sklearn現實世界數據集20 新聞組數據集3. 數據集的劃分特…

攜全雙工語音通話大模型亮相WAIC,Soul重塑人機互動新范式

近日&#xff0c;WAIC 2025在上海隆重開幕。作為全球人工智能領域的頂級盛會&#xff0c;本屆WAIC展覽聚焦底層能力的演進與具體垂類場景的融合落地。堅持“模應一體”方向、立足“AI社交”的具體場景&#xff0c;Soul App此次攜最新升級的自研端到端全雙工語音通話大模型亮相&…

第2章 cmd命令基礎:常用基礎命令(1)

Hi~ 我是李小咖&#xff0c;主要從事網絡安全技術開發和研究。 本文取自《李小咖網安技術庫》&#xff0c;歡迎一起交流學習&#x1fae1;&#xff1a;https://imbyter.com 本節介紹的命令有目錄操作&#xff08;cd&#xff09;、清屏操作&#xff08;cls&#xff09;、設置顏色…

Java 10 新特性解析

Java 10 新特性解析 文章目錄Java 10 新特性解析1. 引言2. 本地變量類型推斷&#xff08;JEP 286&#xff09;2.1. 概述2.2. 使用場景2.3. 限制2.4. 與之前版本的對比2.5. 風格指南2.6. 示例代碼2.7. 優點與注意事項3. 應用程序類數據共享&#xff08;JEP 310&#xff09;3.1. …

【WRF工具】服務器中安裝編譯GrADS

目錄 安裝編譯 GrADS 所需的依賴庫 conda下載庫包 安裝編譯 GrADS 編譯前檢查依賴可用性 安裝編譯 GrADS 參考 安裝編譯 GrADS 所需的依賴庫 以統一方式在 $HOME/WRFDA_LIBS/grads_deps 下安裝所有依賴: # 選擇一個目錄用于安裝所有依賴庫 export DIR=$HOME/WRFDA_LIBS庫包1…