【排序演算法動畫解】直接插入排序

二十二畫程式設計師發表於2021-07-12

本文為系列專題【資料結構和演算法:簡單方法】的第 14 篇文章。

  1. 資料結構 | 順序表
  2. 資料結構 | 連結串列
  3. 資料結構 | 棧
  4. 資料結構 | 佇列
  5. 資料結構 | 雙連結串列和迴圈連結串列
  6. 資料結構 | 二叉樹的概念和原理
  7. 資料結構 | 二叉樹的建立及遍歷實現
  8. 資料結構 | 線索二叉樹
  9. 資料結構 | 二叉堆
  10. 演算法 | 順序查詢和二分查詢
  11. 資料結構(視訊) | 二叉查詢樹
  12. 排序演算法(視訊) | 排序基本介紹和氣泡排序
  13. 排序演算法(視訊) | 簡單選擇排序

前面介紹了已經介紹了三種排序,暴力排序、氣泡排序和簡單選擇排序,一個共同點都是基於交換。

我們可以用另一種視角來看待排序,即將一個待排序的陣列看成兩個部分:有序區亂序區

在排序開始前,整個陣列都是亂序區,而有序區則為空:

排序開始後,有序區逐漸擴大,亂序區逐漸縮小:

排序完成後,整個陣列都是有序區,亂序區則為空:

核心思想:將陣列看作無序區和有序區兩個區,從無序區中選出一個元素,按大小插入到有序區的合適位置。當無序區為空時,有序區自然就完成排序了。

動態過程如下:

直接插入排序.gif

程式碼實現如下:

/*
 * 直接插入排序
 * array : 陣列
 * length : 陣列長度 
 */
void straight_insertion_sort(int *array, int length)
{
    int i, j;
    // 外層迴圈 決定待插入值
    for (i = 1; i < length; i++) {
        if (array[i] < array[i - 1]) {
            int tmp = array[i]; // 待插入值
            // 內層迴圈 在有序區中為待插入值騰出位置
            for (j = i - 1; j >= 0 && array[j] > tmp; j--) {
                array[j + 1] = array[j];
            }
            array[j + 1] = tmp; // 插入
        }
    }
}

請注意插入元素到有序區的關鍵程式碼 array[j + 1] = tmp;中的 j+1

以上就是直接插入排序的基本原理。

完整程式碼請移步至 GitHub | Gitee 獲取。

如有錯誤,還請指正。

如果覺得寫的不錯,可以點個贊和關注。後續會有更多資料結構和演算法相關文章。

微信掃描下方二維碼,一起學習更多計算機基礎知識。

相關文章