首页 > 编程语言 >写一个方法实现“插入排序算法”,并解释下时间复杂度和空间复杂度

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

时间:2024-11-30 09:37:47浏览次数:8  
标签:arr 数组 复杂度 算法 key 排序 插入排序

/**
 * 插入排序算法
 * @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 来实现对不同类型数据的排序,例如字符串、对象等。

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

标签:arr,数组,复杂度,算法,key,排序,插入排序
From: https://www.cnblogs.com/ai888/p/18578023

相关文章

  • 写一个方法实现“归并排序算法”,并解释下时间复杂度和空间复杂度
    functionmergeSort(arr){if(arr.length<=1){returnarr;//递归终止条件:数组长度小于等于1时,已经有序}constmid=Math.floor(arr.length/2);constleft=arr.slice(0,mid);constright=arr.slice(mid);//递归地对左右两部分进行排序c......
  • 写一个方法实现“桶排序算法”,并解释下时间复杂度和空间复杂度
    /***桶排序算法(BucketSort)**@param{number[]}arr待排序数组,元素值应在[minVal,maxVal]范围内*@param{number}minVal数组元素最小值*@param{number}maxVal数组元素最大值*@param{number}bucketSize桶的大小,影响桶的数量*@returns{number[]......
  • 写一个方法实现“基数排序算法”,并解释下时间复杂度和空间复杂度
    functionradixSort(arr){if(!Array.isArray(arr)||arr.length<=1){returnarr;}//1.找到数组中的最大值,以确定最大位数letmax=Math.max(...arr);letexp=1;//1,10,100...//2.循环执行计数排序,从个位到最高位while(max/exp>=......
  • 说说你对js排序的理解,你有了解哪些算法呢?
    我对JavaScript排序的理解是,它主要用于对数组中的元素进行排序,使其按照一定的顺序排列,比如升序或降序。JavaScript提供了内置的sort()方法来实现排序,同时也允许开发者自定义排序逻辑。我了解以下几种JavaScript排序算法:1.内置sort()方法:JavaScript的sort()方法默......
  • 写一个方法实现“选择排序算法”,并解释下时间复杂度和空间复杂度
    functionselectionSort(arr){constn=arr.length;for(leti=0;i<n-1;i++){//FindtheminimumelementintheunsortedpartofthearrayletminIndex=i;for(letj=i+1;j<n;j++){if(arr[j]<arr[minInd......
  • 写一个方法实现“交换排序算法”,并解释下时间复杂度和空间复杂度
    /***交换排序(冒泡排序)**@param{Array<number>}arr待排序的数组*@returns{Array<number>}排序后的数组*/functionexchangeSort(arr){constn=arr.length;letswapped;//优化:如果一趟没有交换,说明已经有序for(leti=0;i<n-1;i++){......
  • 数据结构与算法(排序算法)
    排序的概念1.排序是指将一组数据,按照特定的顺序进行排列的过程。2. 这个过程通常是为了使数据更加有序,从而更容易进行搜索、比较或其他操作。常见的排序算法插入排序  1.把待排序的记录,按其关键码值的大小,逐个插入到一个已经排好序的有序序列中,直......
  • 【初阶数据结构和算法】初识树与二叉树的概念以及堆和完全二叉树之间的关系
    文章目录一、树的概念与结构1.树的概念2.树的相关术语3.树的表示4.树形结构实际运用举例二、二叉树的概念及特殊二叉树1.二叉树的概念2.特殊的二叉树满二叉树完全二叉树二叉树的性质(由满二叉树特点推导)三、二叉树的存储结构1.二叉树的顺序结构2.二叉树的链式结构......
  • 回溯算法part03
    文章参考来源代码随想录93.复原IP地址1.递归参数字符串(不能加const因为要在字符串上加‘.’,因此本题不用组合,直接将字符串加入到结果中),当前层递归开始遍历的地方,计数器(记录‘.’的个数)2.递归终止条件当计数器到达3时(说明分成四段了),判断最后一段是否满足区间函数,若满足加......
  • 顺序表的时间复杂度介绍
    顺序表的时间复杂度介绍引言顺序表(Array)是一种常见的数据结构,它在逻辑上是一种线性表,物理结构上是顺序存储。顺序表通过连续的内存空间存储数据元素,具有高效的随机访问特性。本文将详细介绍顺序表的增删改查操作的时间复杂度,并从最好、最坏和平均三个角度分析其性能表现。同时,我......