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

本文為系列專題【數據結構和演算法:簡單方法】的第 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 獲取。

如有錯誤,還請指正。

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

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