js中,什么是插入排序?

5 阅读1分钟

插入排序(Insertion Sort)是一种简单直观的排序算法,其工作原理类似于我们整理扑克牌的方式:将未排序的元素逐个插入到已排序部分的合适位置中


🧠 基本思想

  1. 从数组的第二个元素开始(索引为 1),认为第一个元素已经是“有序”的。
  2. 取出当前元素(称为“key”或“待插入元素”)。
  3. 将它与前面已排序的部分从后往前比较。
  4. 如果前面的元素比它大(升序情况下),就将前面的元素向后移动一位。
  5. 重复此过程,直到找到合适的位置,然后将 key 插入。
  6. 重复上述步骤,直到整个数组有序。

✅ 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²))。
  • 不适合大规模乱序数据。

💡 应用场景

  • 作为更复杂排序算法(如快速排序、归并排序)的子程序,用于处理小数组。
  • 在线算法(可以边接收数据边排序)。