【數據結構】排序(sort) -- 插入排序

目錄

一、插入排序

二、直接插入排序(straight insertion sort)

1. 思路介紹

2. 代碼實現

3. 特性總結?

三、希爾排序(Shell sort)

1. 思路介紹

2. 代碼實現

3. 特性總結?

四、總結


一、插入排序

常見的排序算法有:

而本篇文章要介紹的是插入排序。

插入排序可以分為?直接插入排序?和?希爾排序?


二、直接插入排序(straight insertion sort)

1. 思路介紹

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

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

如圖是基本思想的示意圖:排序思路:

  1. 將整個數據劃分為有序區和無序區,初始時有序區只有一個數據,無序區包含了剩余所有待排序數據。
  2. 將無序區的第一個數據插入到有序區的合適位置中,從而使無序區減少一個數據,有序區增加一個數據。
  3. 重復步驟2,知道無序區沒有數據。

?對于一組數據:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48? 它的排序個過程如下:

排序動圖如下:

排序一個數據的方法(排升序):

????????將要排序數據先和有序區的最后一個數據比較,如果比該數據小,就將有序區該數據向后移動一位;如果比該數據大,就什么都不做,因為這樣已經將該要排序數據排好了。排序一個數據的代碼實現:

int end;// 有序區最后一個數據的下標
int tmp;// 該趟要排序的數據// 插入:將tmp插入到[0,end]區間中去
while (end >= 0)
{if (tmp < a[end]){a[end + 1] = a[end];// 后移有序區數據end--;}else{break;// 已經找到到合適位置,則退出循環}
}
a[end + 1] = tmp;// 插入合適位置

2. 代碼實現

排序一組數據,就只需要遍歷所有數據,逐步插入就可以了。則C語言代碼實現:

// 插入排序 - 排升序
void InsertSort(int* a, int n)
{for (int i = 1; i < n; i++){int end = i - 1;// 有序區最后一個數據的下標int tmp = a[i];// 該趟要排序的數據// 插入:將tmp插入到[0,end]區間中去while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];// 后移有序區數據end--;}else{break;// 已經找到到合適位置,則退出循環}}a[end + 1] = tmp;// 插入合適位置}
}

3. 特性總結?

直接插入排序的特性總結:

  1. 元素集合越接近有序,直接插入排序算法的時間效率越高
  2. 時間復雜度:O(N^2),最好情況:O(N),最壞情況:O(N^2)
  3. 空間復雜度:O(1)
  4. 穩定性:穩定


    三、希爾排序(Shell sort)

    1. 思路介紹

    ????????希爾排序是對直接插入排序的一種改進。

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

    ????????把待排序數據分割為若干子序列,再對各個子序列分別進行直接插入排序。

    排序思路:

    1. 先選定一個整數gap,表示間隔,把待排序文件中所有記錄分成gap個組,把所有距離為gap的記錄分在同一組內,并對每一組內的記錄進行直接插入排序,讓整個數據接近有序。
    2. 然后,每次將gap縮小一半,重復上述分組排序的工作,讓整個數據逐漸接近有序。
    3. 當到達gap = 1時,就相當于普通的直接插入排序,但此時整個數據已經非常接近有序,排序效率是非常高。

    所以,當gap>1時,這就是對數據的預排序;當gap=1時,這就是普通直接插入排序。

    如圖是希爾排序的示意圖:

    排序間隔為gap的一組。

    如圖為假設 gap = 3 時其中一組數據的的直接插入排序:

    排序間隔為gap的其中一組的代碼實現:

    int gap;// 間隔
    for (int i = gap; i < n; i += gap)
    {int end = i - gap;// 有序區最后一個數據的下標int tmp = a[i];// 該趟要排序的數據// 間隔gap插入while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];// 后移有序區數據end -= gap;}else{break;// 已經找到到合適位置,則退出循環}}a[end + gap] = tmp;// 插入合適位置
    }

    那么排序gap時,所有組的實現就是通過調整狀態的起始位置,然后重復上述實現:

    int gap;// 間隔
    for (int j = 0; j < gap; j++)
    {for (int i = j + gap; i < n; i += gap){int end = i - gap;// 有序區最后一個數據的下標int tmp = a[i];// 該趟要排序的數據// 間隔gap插入while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];// 后移有序區數據end -= gap;}else{break;// 已經找到到合適位置,則退出循環}}a[end + gap] = tmp;// 插入合適位置}
    }

    如圖所示,為當gap=3時的一組排序過程:


    直到一組gap值的排序后,就可以再調整gap值為原來的一半,重復這個過程就可以了。

      一般來說,gap的值是可以隨意取的。但

      gap如果越大,那么間隔就大,排完一組的的時間就快,但這樣越不接近有序;

      gap如果越小,那么間隔就小,排完一組的的時間就慢,但這樣越接近有序;

      ? ? ? ? 所以,希爾排序(Shell Sort)的間隔gap初始值通常取原數據長度的一半(即 gap = n/2),然后逐步縮小(如每次減半),最終縮小到1進行最后一次插入排序。

      ????????n/2 的間隔能確保子序列覆蓋整個數組,避免遺漏元素。

      2. 代碼實現

      希爾排序C語言實現如下:

      //希爾排序
      void ShellSort(int* a, int n)
      {int gap = n;// 間隔while (gap > 1){gap /= 2;for (int j = 0; j < gap; j++){for (int i = j + gap; i < n; i += gap){int end = i - gap;// 有序區最后一個數據的下標int tmp = a[i];// 該趟要排序的數據// 插入while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];// 后移有序區數據end -= gap;}else{break;// 已經找到到合適位置,則退出循環}}a[end + gap] = tmp;// 插入合適位置}}}
      }

      可以發現這里的循環很多,所以這里可以簡化一下:

      void ShellSort(int* a, int n)
      {int gap = n;// 間隔while (gap > 1){gap /= 2;for (int i = gap; i < n; i++){int end = i - gap;// 有序區最后一個數據的下標int tmp = a[i];// 該趟要排序的數據// 插入while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];// 后移有序區數據end -= gap;}else{break;// 已經找到到合適位置,則退出循環}}a[end + gap] = tmp;// 插入合適位置}}
      }

      3. 特性總結?

      希爾排序的特性總結:

      1. 希爾排序是對直接插入排序的優化。
      2. 當gap > 1時都是預排序,目的是讓數組更接近于有序。當gap == 1時,數組已經接近有序的了,這樣就會很快。這樣整體而言,可以達到優化的效果。
      3. 希爾排序的時間復雜度不好計算,因為gap的取值方法很多,導致很難去計算。一般來說,時間復雜度是Q(n^{1.3})~O(n^{2})之間。
      4. 空間復雜度:O(1)
      5. 穩定性:不穩定

      四、總結

      • 直接插入排序通過將待排序元素逐個插入已排序序列來實現排序,時間復雜度為O(N^2),適用于接近有序的數據。
      • 希爾排序是直接插入排序的改進版本,采用分組排序策略,先通過較大間隔進行預排序,再逐步縮小間隔直至1,提高了整體排序效率。
      • 希爾排序的時間復雜度難以精確計算,但優于直接插入排序,空間復雜度均為O(1)。
      • 兩種算法的主要區別在于:直接插入排序穩定但效率較低,希爾排序不穩定但效率較高。

      感謝各位觀看!希望能多多支持!

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

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

      相關文章

      水面垃圾清掃船cad【6張】三維圖+設計說明書

      海洋吸塵器結構設計 摘 要 近年來&#xff0c;隨著經濟的快速發展&#xff0c;海洋產業及海上活動的增加&#xff0c;導致海洋漂浮垃圾越來越多&#xff0c;對沿岸的居民和海洋的生物的生命安全造成了很大的威脅&#xff0c;嚴重破壞海洋生態平衡。針對海洋垃圾污染這一主要問…

      03-List列表數據類型

      1.特點&#xff1a; 原屬是字符串類型 列表頭尾增刪塊&#xff0c;中間慢&#xff0c;增刪元素是常態 元素可重復 最多包含2^32-1個元素 索引通python列表2.常用命令 ------增------ 1.從列表頭部壓入數據LPUSH key value1 value22.從列表尾部壓入數據RPUSH key value1 value23…

      防火墻認證用戶部署

      文章目錄1、配置vlan2、防火墻配置&#xff08;1&#xff09;配置安全區域&#xff08;2&#xff09;接口加入安全區域(3)fw配置DHCP(4)地址組&#xff08;5&#xff09;管理員(6)用戶認證1、配置vlan vlan batch 10 20 [Huawei-GigabitEthernet0/0/2]port link-type access …

      Vue.js之監聽器

      watch偵聽器&#xff1a;作用:監視數據變化&#xff0c;執行一些 業務邏輯 或 異步操作。 語法:簡單寫法→簡單類型數據&#xff0c;直接監視完整寫法 → 添加額外配置項 (1)deep:true 對復雜類型深度監視(2)immediate:true 初始化立刻執行一次handler方法//1.簡單寫法 data: {…

      25電賽e題雜亂環境穩定識別矩形框(附源碼)

      ? 識別并跟蹤矩形目標 識別視頻中符合矩形輪廓的目標區域&#xff0c;并標記中心點位置。 實現思路 **圖像預處理&#xff1a;灰度 二值化**閉運算消除孔洞二值化處理查找并篩選矩形輪廓解算中心點目標篩選結果繪制 環境 使用 OpenCV 和 python&#xff1a; 圖像預處理…

      【前端安全】聊聊 HTML 閉合優先級和瀏覽器解析順序

      【前端安全】聊聊瀏覽器解析順序和 HTML 閉合優先級 最近在研究 XSS 的時候&#xff0c;發現一個特別容易被忽略的問題 —— 瀏覽器到底是怎么解析 HTML 的&#xff1f;為什么有些 payload 成功了&#xff0c;有些卻怎么試都不行&#xff1f;其實這跟標簽的閉合優先級還有解析順…

      PHP-分支語句、while循環、for循環

      分支語句 無論在何種編程語言中&#xff0c;流程控制都是很重要的內容。由于 PHP 的大部分語法都繼承了C語言的特點&#xff0c; 因此在流程控制方面&#xff0c;PHP 有著和C語言類似的流程控制。 if else 語句是流程控制中根據條件判斷執行的一種。該語句執行時先對條件進行判…

      并發編程常用工具類(下):CyclicBarrier 與 Phaser 的協同應用

      在并發編程中&#xff0c;除了CountDownLatch和Semaphore&#xff0c;CyclicBarrier和Phaser也是實現多線程協作的重要工具。它們在處理多階段任務同步、動態調整參與線程等場景中展現出獨特價值。本文作為并發工具類系列的第二篇&#xff0c;將深入解析CyclicBarrier和Phaser的…

      機器人焊接節氣裝置

      在摩托車制造過程中&#xff0c;精密部件的焊接質量直接影響整車的安全性和操控性能。以發動機缸體焊接為例&#xff0c;傳統手工焊接容易出現焊縫不均勻的問題&#xff0c;而采用六軸弧焊機器人后&#xff0c;焊接精度能控制在0.1毫米以內。日本川崎重工的生產數據顯示&#x…

      使用yolo11訓練食物浪費檢測數據集VOC+YOLO格式6734張32類別步驟和流程

      【數據集介紹】數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件)圖片數量(jpg文件個數)&#xff1a;6734標注數量(xml文件個數)&#xff1a;6734標注數量(txt文件個數)&#xff1…

      掌握PowerPC架構與編程技巧:技術資料詳解

      本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;PowerPC是一種高性能的RISC架構&#xff0c;最初由IBM、Motorola和Apple聯合開發&#xff0c;被設計用于高端工作站和服務器&#xff0c;同時廣泛應用于嵌入式系統、航空電子設備、游戲主機和超級計算機等領域。…

      VR 企業展廳:開啟數字化展示新時代

      在當今數字化浪潮席卷各行各業的時代&#xff0c;企業的展示與宣傳方式也在不斷革新。VR&#xff08;虛擬現實&#xff09;技術的出現&#xff0c;為企業展廳帶來了全新的變革&#xff0c;使其從傳統的實體展示空間&#xff0c;轉變為具有無限可能的數字化虛擬空間。一、VR 企業…

      測試用例顆粒度全解析

      引言&#xff1a;為什么顆粒度是測試團隊的“隱形門檻”&#xff1f;在軟件測試領域&#xff0c;測試用例顆粒度&#xff08;即測試用例的詳細程度&#xff09;看似是一個基礎問題&#xff0c;卻常常成為團隊協作的“隱形門檻”。某電商平臺測試團隊曾出現過這樣的窘境&#xf…

      分布式鎖的基本原理和基于lua腳本的實現(Redisson)

      為了確保分布式鎖可用&#xff0c;我們要確保鎖的實現同時滿足以下四個條件&#xff1a;- 互斥性。在任意時刻&#xff0c;只有一個客戶端能持有鎖。- 不會發生死鎖。即使有一個客戶端在持有鎖的期間崩潰而沒有主動解鎖&#xff0c;也能保證后續其他客戶端能加鎖。- 解鈴還須系…

      智慧園區數字孿生全生命周期交付體系:從虛擬建模到全域智聯的快速交付新常態

      在數字經濟與綠色低碳轉型的雙重驅動下&#xff0c;智慧園區建設正經歷從“物理空間堆砌”到“數據智能驅動”的范式革命。數字孿生技術作為核心引擎&#xff0c;通過構建物理園區的虛擬鏡像&#xff0c;實現虛實空間的毫秒級同步與智能協同&#xff0c;推動園區管理向全要素感…

      電腦忘記開機密碼怎么辦?【圖文詳解】5種方法重置/更改/取消/設置開機密碼?

      一、問題背景誰都有馬虎的時候&#xff0c;要是突然忘了電腦開機密碼&#xff0c;就只能對著登錄界面干著急&#xff0c;沒法打開電腦處理工作、查看文件&#xff0c;太影響效率了。別慌&#xff0c;其實有不少簡單實用的辦法能解除或重置密碼&#xff0c;下面就來一一介紹&…

      Go語言select

      select是什么select是Go語言層面提供的一種多路復用機制&#xff0c;用于檢測當前goroutine連接的多個channel是否有數據準備完畢&#xff0c;可用于讀或寫。Go語言的select語句&#xff0c;是用來起一個goroutine監聽多個Channel的讀寫事件&#xff0c;提高從多個Channel獲取信…

      VUE+SPRINGBOOT從0-1打造前后端-前后臺系統-整體示例

      一、注冊、登錄、密碼找回二、VUE前臺系統三、VUE后臺系統

      深入解析SmolVLA:VLM與動作專家間的注意力機制交互

      在機器人學習領域&#xff0c;如何有效地將視覺語言模型&#xff08;VLM&#xff09;的強大感知能力與低級動作控制相結合&#xff0c;是實現通用機器人智能的關鍵挑戰。SmolVLA&#xff08;Small Vision-Language-Action&#xff09;架構正是在這一背景下應運而生&#xff0c;…

      Spring Security 認證與授權實現機制

      Spring Security 是一個功能強大且高度可定制的身份驗證和訪問控制框架&#xff0c;其認證和授權實現機制如下&#xff1a;一、認證(Authentication)實現 1. 核心組件 AuthenticationManager&#xff1a;認證入口點&#xff0c;委托給AuthenticationProviderAuthenticationProv…