插入排序(Insertion Sort)是一种简单直观的排序算法,其工作原理类似于我们整理扑克牌的方式:将未排序的元素逐个插入到已排序部分的合适位置中。
🧠 基本思想
- 从数组的第二个元素开始(索引为 1),认为第一个元素已经是“有序”的。
- 取出当前元素(称为“key”或“待插入元素”)。
- 将它与前面已排序的部分从后往前比较。
- 如果前面的元素比它大(升序情况下),就将前面的元素向后移动一位。
- 重复此过程,直到找到合适的位置,然后将 key 插入。
- 重复上述步骤,直到整个数组有序。
✅ JavaScript 实现(升序)
function insertionSort(arr) {
for (let i = 1; i < arr.length; i++) {
let key = arr[i];
let j = i - 1;
// 将大于 key 的元素向后移动
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
// 插入 key 到正确位置
arr[j + 1] = key;
}
return arr;
}
// 示例
console.log(insertionSort([5, 2, 4, 6, 1, 3])); // [1, 2, 3, 4, 5, 6]
⏱️ 时间复杂度
- 最好情况:O(n) —— 数组已经有序。
- 平均/最坏情况:O(n²) —— 数组逆序或随机排列。
- 空间复杂度:O(1) —— 原地排序(in-place)。
✅ 优点
- 实现简单,代码短小。
- 对于小规模数据或基本有序的数据效率很高。
- 是稳定排序(相等元素的相对位置不会改变)。
- 是原地排序(不需要额外存储空间)。
❌ 缺点
- 数据量大时效率低(O(n²))。
- 不适合大规模乱序数据。
💡 应用场景
- 作为更复杂排序算法(如快速排序、归并排序)的子程序,用于处理小数组。
- 在线算法(可以边接收数据边排序)。