【保姆級圖解】插入排序 算法詳解:直接插入排序、希爾排序

?總體引入

在計算機科學的算法領域中,排序是一項基礎且重要的操作。它旨在將一組無序的數據元素重新排列為有序序列,以滿足特定的順序要求,如升序或降序。常見的排序算法可分為不同類別,像插入排序,包含直接插入排序和希爾排序;選擇排序,有直接選擇排序和堆排序;交換排序,涵蓋冒泡排序和快速排序;還有歸并排序 。這些算法各有特點,適用于不同的應用場景,接下來讓我們深入了解它們。

?

插入排序引入

想象你整理撲克牌時,會從一堆牌里一張一張拿出來,按順序插到已經整理好的牌堆合適位置 。編程里的插入排序差不多也是這個道理。它把數據分成已排序和未排序兩部分,從 未排序部分取元素,在已排序部分找到合適位置插入,不斷重復,直到所有元素都排好序,就像把亂序的撲克牌整理成有序的一樣。

一、直接插入排序(Insertion Sort)

算法思想
將數組分為“已排序”和“未排序”兩部分,逐個將未排序部分的元素插入到已排序部分的正確位置。

代碼解析

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;            // 插入元素到正確位置}
}

步驟說明

  1. 外層循環:遍歷每個待插入元素(從第二個元素開始)。

  2. 內層循環:從后向前比較,若當前元素比待插入元素大,則將其后移。

  3. 插入操作:找到第一個比待插入元素小的位置,將元素插入其后。

復雜度分析

  • 時間復雜度:

    • 最好情況(已有序):O(n),只需比較無需移動。

    • 最壞情況(逆序):O(n2),每次插入需移動全部已排序元素。

  • 空間復雜度:O(1),原地排序。

適用場景
數據量小或基本有序時效率高,穩定且簡單。


二、希爾排序(Shell Sort)

算法思想
希爾排序是對直接插入排序的一種改進算法,它通過將待排序的數組按照一定的間隔(稱為增量)進行分組,對每組分別進行直接插入排序,逐步縮小增量,當 gap > 1 時都是預排序,?的是讓數組更接近于有序。當 gap == 1 時,數組已經接近有序的了,這樣就會很快。這樣整體??,可以達到優化的效果。

代碼解析

void ShellSort(int* arr, int n) {int gap = n;                       // 初始間隔設為數組長度while (gap > 1) {                  // 循環直到間隔為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;      // 插入元素}}
}

步驟說明

  1. 動態調整間隔:初始間隔較大,逐步縮小(gap = gap/3 + 1)或者(gap = gap/2)

  2. 分組插入排序:對每個間隔形成的子序列進行插入排序。

  3. 最終排序:當間隔為1時,退化為標準插入排序,此時數組已基本有序。

復雜度分析

  • 時間復雜度:約 O(n^1.3),依賴增量序列的選擇。

  • 空間復雜度:O(1),原地排序。

適用場景
中等規模數據,對穩定性無要求,優于直接插入排序。


測試案例
void test01() {int arr[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};int size = sizeof(arr) / sizeof(arr[0]);// InsertSort(arr, size);ShellSort(arr, size);for (int i = 0; i < size; i++) {printf("%d ", arr[i]);  // 輸出:0 1 2 3 4 5 6 7 8 9}
}

運行結果
無論調用哪個排序函數,最終輸出均為有序數組 0 1 2 3 4 5 6 7 8 9


總結
  • 直接插入排序:簡單穩定,適合小數據或部分有序場景。

  • 希爾排序:插入排序的高效改進,適合中等規模數據。

理解基礎排序算法的實現有助于掌握更復雜的排序技術,實際應用中可根據數據特征選擇合適的算法。

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

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

相關文章

為什么ChatGPT選擇SSE而非WebSocket?

為什么ChatGPT選擇SSE而非WebSocket&#xff1f; 一、ChatGPT回答問題的技術邏輯 ChatGPT的響應生成基于Transformer架構和自注意力機制&#xff0c;其核心是通過概率預測逐詞生成文本。當用戶輸入問題后&#xff0c;模型會先解析上下文&#xff0c;再通過預訓練的龐大語料庫…

Android 手機指紋傳感器無法工作,如何恢復數據?

天津鴻萌科貿發展有限公司從事數據安全服務二十余年&#xff0c;致力于為各領域客戶提供專業的數據恢復、數據清除、數據備份、數據取證、數據遷移解決方案&#xff0c;并針對企業面臨的數據安全風險&#xff0c;提供專業的相關數據安全培訓。 天津鴻萌科貿發展有限公司是眾多國…

DeepSeek 在金融領域的應用解決方案

DeepSeek 在金融領域的應用解決方案 一、背景 隨著人工智能技術的快速發展&#xff0c;DeepSeek 作為一款國產大模型&#xff0c;憑借其強大的語義理解、邏輯推理和多模態處理能力&#xff0c;在金融行業迅速嶄露頭角。金融行業作為經濟的核心&#xff0c;面臨著激烈的市場競…

織光五載 煥新啟航

成都時尚產業協會5周年 以創新為筆&#xff0c;續寫國際時尚之都的璀璨篇章 【一場跨越時空的時尚對話】 五年前&#xff0c;一顆名為"成都時尚產業協會"的種子在蓉城落地生根&#xff1b;五年后&#xff0c;這棵新芽已成長為枝繁葉茂的生態之樹&#xff0c;用交織…

scala集合

一、數組&#xff08;Array&#xff09; 1.數組轉換 不可變轉可變&#xff1a;arr1.toBuffer&#xff0c;arr1本身沒有變化 可變轉不可變&#xff1a;arr2.toArray&#xff0c;arr2本身沒有變化 2.多維數組 創建&#xff1a;val arr Array.ofDim[Int](3, 4)&#xff08;3 …

常用 Excel VBA 技巧,簡單好學易上手

在日常辦公中&#xff0c;我們常常會遇到各種繁瑣的數據處理任務&#xff0c;而 Excel VBA&#xff08;Visual Basic for Applications&#xff09;作為一款強大的自動化工具&#xff0c;能夠幫助我們輕松應對這些挑戰。本文將介紹一些常用且簡單好學的 Excel VBA 技巧&#xf…

Java 基礎 - 反射(1)

文章目錄 引入類加載過程1. 通過 new 創建對象2. 通過反射創建對象2.1 觸發加載但不初始化2.2 按需觸發初始化2.3 選擇性初始化控制 核心用法示例1. 通過無參構造函數創建實例對象2. 通過有參構造函數創建實例對象3. 反射通過私有構造函數創建對象&#xff0c; 破壞單例模式4. …

如何在React中集成 PDF.js?構建支持打印下載的PDF閱讀器詳解

本文深入解析基于 React 和 PDF.js 構建 PDF 查看器的實現方案&#xff0c;該組件支持 PDF 渲染、圖片打印和下載功能&#xff0c;并包含完整的加載狀態與錯誤處理機制。 完整代碼在最后 一個PDF 文件&#xff1a; https://mozilla.github.io/pdf.js/web/compressed.tracemo…

數據結構與算法-動態規劃-線性動態規劃,0-1背包,多重背包,完全背包,有依賴的背包,分組背包,背包計數,背包路徑

動態規劃原理 動態規劃這玩意兒&#xff0c;就好比是在拓撲圖上玩跳格子游戲。在圖論中&#xff0c;咱們是從特定的節點跳到其他節點&#xff1b;而在動態規劃里呢&#xff0c;我們是從一個狀態 “嗖” 地轉移到另一個狀態。狀態一般用數組來表示&#xff0c;就像 f [i][j]&am…

解決文件夾解壓中文字符產生亂碼的問題

太tm智能了&#xff0c;本來還想看看解壓工具在哪里修改&#xff0c;智能的識別到亂碼了。點贊 看到那個地球了嗎&#xff0c;點擊那個球&#xff0c;這個修改不是侵略性的&#xff0c;不會修改壓縮文件本身所以需要在當前頁面解壓 參考 https://blog.csdn.net/QCSYSZQ/artic…

C++與C的區別

目錄 前言 一、從字面上看 二、從編程思想上看 三、C 和 C++ 都有各自適合的領域和特性 四、劃重點 前言 本文主要對 C 和 C++ 兩種編程語言進行對比區分,便于大家理解 一、從字面上看 1.首先:兩者第一個字符完全一致 說明:C++ 完全兼容 C ,凡是合法的 C 程序在 C…

水利水電安全員ABC適合哪些人考?

水利水電安全員證是水利工程建設領域的重要職業資格證書&#xff0c;主要涉及水利水電工程施工安全管理、風險防控和應急處理等工作。那么&#xff0c;哪些人適合考取&#xff1f; 哪些人適合考水利水電安全員&#xff1f; 1. 水利水電工程從業人員 ? 施工管理人員&#xf…

Linux中用gdb查看coredump文件

查看dump的命令&#xff1a; gdb 可執行文件 dump文件路徑查看函數調用棧 (gdb)bt查看反匯編代碼 (gdb)disassemble查看寄存器的值 (gdb)info all-registers如果通過上述簡單命令無法排查&#xff0c;還是通過-g參數編譯帶符號表的可執行文件&#xff0c;再用gdb查看

【前端】【React】useCallback的作用與使用場景總結

一、useCallback 的作用與使用場景總結 useCallback 是 React 提供的一個 Hook&#xff0c;用于緩存函數的引用&#xff0c;避免因為組件重新渲染而導致函數地址發生變化。它返回一個記憶&#xff08;memoized&#xff09;后的回調函數&#xff0c;只有當依賴項發生變化時才會…

藍橋杯備賽學習筆記:高頻考點與真題預測(C++/Java/python版)

2025藍橋杯備賽學習筆記 ——高頻考點與真題預測 一、考察趨勢分析 通過對第13-15屆藍橋杯真題的分析&#xff0c;可以發現題目主要圍繞基礎算法、數據結構、數學問題、字符串處理、編程語言基礎展開&#xff0c;且近年逐漸增加動態規劃、圖論、貪心算法等較難題目。 1. 基…

20250410在榮品的PRO-RK3566開發板使用Rockchip原廠的buildroot系統時自動掛載eth0【直接編譯進IMG】

【暫時沒有找到第一次編譯就可以修改的地方&#xff01;&#xff01;&#xff01;&#xff01;】 rootrootrootroot-X99-Turbo:~/RK3566_RK3568_Linux5.10_V1.2.0$ find . -name interfaces 【完整編譯之后&#xff0c;基本確認修改這里有效。】 ./buildroot/output/rockchip_r…

c11新特性,繼承構造函數

#include <iostream> #include <string>class Person { public:std::string name;int age;// 主構造函數Person(const std::string& name, int age) : name(name), age(age) {std::cout << "Person created with name: " << name <&l…

【TS學習】(24)什么是裝飾器

在 TypeScript 中&#xff0c;裝飾器&#xff08;Decorators&#xff09; 是一種特殊的聲明&#xff0c;用于為類、類成員&#xff08;屬性、方法、訪問器&#xff09;、方法參數或整個類添加元數據或修改其行為。裝飾器是 JavaScript 和 TypeScript 的實驗性特性&#xff0c;廣…

datagrip如何連接數據庫

datagrip連接數據庫的步驟 2025版本 想要鏈接數據庫是需要一個jar包的&#xff0c;所以將上面進行刪除之后&#xff0c;需要下載一個jar包 那么這個時候需要鏈接上傳一個mysql鏈接的jar包 選擇核心驅動類 上述操作完成之后&#xff0c;然后點擊apply再點擊ok即可 如下圖說明my…

菊風RTC 2.0 開發者文檔正式發布,解鎖音視頻新體驗!

重磅發布&#xff01; 開發者們&#xff0c;菊風實時音視頻2.0文檔已正式發布上線&#xff0c;為您提供更清晰、更高效的開發支持&#xff01;讓菊風實時音視頻2.0為您的音視頻應用加速~ 菊風實時音視頻2.0聚焦性能升級、體驗升級、錄制服務升級&#xff0c;助力視頻通話、語…