本文為系列專題【資料結構和演算法:簡單方法】的第 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
。
以上就是直接插入排序的基本原理。
如有錯誤,還請指正。
如果覺得寫的不錯,可以點個贊和關注。後續會有更多資料結構和演算法相關文章。
微信掃描下方二維碼,一起學習更多計算機基礎知識。