数据结构基础:插入排序与选择排序详解
一、排序概述
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减地排列起来的操作。
常见的排序算法包括插入排序、选择排序、交换排序、归并排序和基数排序等。今天我们将重点深入讲解 插入排序 和 选择排序 这两类基础算法。

二、插入排序
2.1 直接插入排序
基本思想: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。
实际生活中,我们玩扑克牌时经常用到这个思想:抓到一张新牌,就依次与手中的牌比较,找到合适的位置插进去。
实现逻辑: 当插入第 i (i>=1) 个元素时,前面的 array[0], array[1], …, array[i-1] 已经排好序。此时用 array[i] 的关键码值与 array[i-1], array[i-2], … 的顺序进行比较,找到插入位置即将 array[i] 插入,原来位置上的元素顺序后移。
void InsertSort(int* a, int n) {
for (int i = 0; i < n - 1; i++) {
int end = i;
int tmp = a[end + 1]; // tmp 表示新插入进来的元素
while (end >= 0) {
if (a[end] > tmp) { // 如果 tmp 比当前元素小,就把当前元素往后移动
a[end + 1] = a[end];
end--;
} else {
break; // 找到合适位置
}
}
a[end + 1] = tmp; // 将 tmp 插入到空位
}
}
特性总结:
- 元素集合越接近有序,直接插入排序算法的时间效率越高。
- 时间复杂度:O(N^2)
- 空间复杂度:O(1)
虽然 O(N^2) 对于小规模数据尚可接受,但在大数据量下确实太慢。接下来我们看看它的优化版本——希尔排序。


