五大经典排序算法详解
在面试和实际开发中,基础排序算法的掌握程度往往能反映出对数据结构理解的深度。今天我们把五种最经典的排序——插入、希尔、冒泡、选择和堆排序,从头到尾梳理一遍,重点看代码实现背后的逻辑和性能差异。
插入排序
核心思想
插入排序的逻辑其实很直观:逐步构建有序序列。你可以把它想象成整理扑克牌:每次摸到一张新牌,就把它插到手里已经排好序的牌堆里的正确位置。
具体做法是将数组分为'已排序'和'未排序'两部分。初始时,第一个元素视为已排序。之后从未排序部分取出一个元素,向前遍历已排序部分,找到合适位置插入。

代码实现
// 插入排序(此处演示降序,升序将 a[end] < tmp 改为 a[end] > tmp)
void InsertSort(int* a, int n) {
// 从第 2 个元素开始遍历未排序部分
for (int i = 1; i < n; i++) {
int end = i - 1; // 已排序部分的末尾下标
int tmp = a[i]; // 保存当前待插入元素
// 向前查找合适位置,大于 tmp(降序)则后移腾出空间
while (end >= 0) {
if (a[end] < tmp) {
a[end + 1] = a[end];
end--;
} else {
break; // 找到位置,退出循环
}
}
a[end + 1] = tmp; // 插入到正确位置
}
}
效率分析
- 时间复杂度:最坏情况是 O(N^2),比如逆序数组;但如果是基本有序的数组,每个元素只需比较一次,可优化至 O(N)。
- 空间复杂度:O(1),只用了常数级辅助变量。
- 稳定性:稳定。相等元素的相对位置不会改变。
希尔排序
核心思想
希尔排序是插入排序的升级版,核心在于。




