本文為系列專題【數據結構和算法:簡單方法】的第 14 篇文章。
- 數據結構 | 順序表
- 數據結構 | 鏈表
- 數據結構 | 棧
- 數據結構 | 隊列
- 數據結構 | 雙鏈表和循環鏈表
- 數據結構 | 二叉樹的概念和原理
- 數據結構 | 二叉樹的創建及遍歷實現
- 數據結構 | 線索二叉樹
- 數據結構 | 二叉堆
- 算法 | 順序查找和二分查找
- 數據結構(視頻) | 二叉查找樹
- 排序算法(視頻) | 排序基本介紹和冒泡排序
- 排序算法(視頻) | 簡單選擇排序
前面介紹了已經介紹了三種排序,暴力排序、冒泡排序和簡單選擇排序,一個共同點都是基於交換。
我們可以用另一種視角來看待排序,即將一個待排序的數組看成兩個部分:有序區和亂序區。
在排序開始前,整個數組都是亂序區,而有序區則為空:

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

排序完成后,整個數組都是有序區,亂序區則為空:

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

代碼實現如下:
/*
* 直接插入排序
* 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。
以上就是直接插入排序的基本原理。
如有錯誤,還請指正。
如果覺得寫的不錯,可以點個贊和關注。后續會有更多數據結構和算法相關文章。
微信掃描下方二維碼,一起學習更多計算機基礎知識。

