写一个方法实现“插入排序算法”,并解释下时间复杂度和空间复杂度

/**
 * 插入排序算法
 * @param {Array<number>} arr 待排序的数组
 * @returns {Array<number>} 排序后的数组
 */
function insertionSort(arr) {
  const n = arr.length;
  if (n <= 1) {
    return arr; // 空数组或只有一个元素的数组无需排序
  }

  for (let i = 1; i < n; 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;
}


// 示例用法:
const unsortedArray = [5, 2, 4, 6, 1, 3];
const sortedArray = insertionSort(unsortedArray);
console.log(sortedArray); // 输出: [1, 2, 3, 4, 5, 6]


/**
 * 插入排序算法解释:
 * 
 * 1. 从第二个元素开始,将当前元素视为 key。
 * 2. 将 key 与它之前的元素逐个比较。
 * 3. 如果前面的元素比 key 大,则将该元素向后移动一位。
 * 4. 重复步骤 3,直到找到 key 的正确位置(即前面的元素都比 key 小或者到达数组的开头)。
 * 5. 将 key 插入到正确的位置。
 * 6. 重复步骤 1-5,直到遍历完整个数组。
 */


/**
 * 时间复杂度:
 * - 最好情况:数组已经排好序,每次只需要比较一次,无需移动元素。时间复杂度为 O(n)。
 * - 最坏情况:数组逆序排列,每次都需要将 key 与它之前的每个元素比较并移动。时间复杂度为 O(n^2)。
 * - 平均情况:时间复杂度为 O(n^2)。
 *
 * 空间复杂度:
 * - 插入排序是原地排序算法,只需要常数个额外空间来存储临时变量。空间复杂度为 O(1)。
 */

代码改进及补充说明:

  • 错误处理: 可以添加对输入参数的校验,例如检查 arr 是否为数组,以及数组元素是否为数字。
  • 泛型支持 (TypeScript): 如果使用 TypeScript,可以考虑使用泛型来支持不同数据类型的排序,例如:
function insertionSort<T>(arr: T[], compareFn: (a: T, b: T) => number): T[] {
  // ... (implementation using compareFn for comparisons)
}

这样就可以自定义比较函数 compareFn 来实现对不同类型数据的排序,例如字符串、对象等。

这个改进版的代码更加健壮,并且更符合前端开发中对类型安全和代码可读性的要求。 理解时间和空间复杂度对于评估算法效率至关重要。插入排序虽然在小规模数据上表现良好,但在大型数据集上效率较低,这时可以考虑使用更高效的排序算法,例如快速排序或归并排序。

posted @   王铁柱6  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示