javascript算法排序之插入排序

简介: javascript算法排序之插入排序

前言

经典的排序算法,很多人都听过,很多人也许用过,但是也有很多人,听过没见过。为什么呢?现在我们有了越来越多的框架、依赖包,我们将能用到排序的实际场景,作为业务将其封装成了函数,所以,一些人只知函数而不知其运行逻辑。

基于以上,为了让自己更好的理解函数运行逻辑,整理了一些基本排序的方法的运行规则,以及部分个人理解,希望能给大家一些帮助。

本文将讲述插入排序。

插入排序

插入排序(InsertionSort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序可以理解为日常打牌或打麻将,将摸到的无序的牌整理为有序的牌。

插入排序实现原理

  1. 默认第一个元素为有序序列,而第二个元素到末尾的元素为无序序列;
  2. 以有序序列的下一个元素为目标值,使目标值和有序序列进行遍历比较;
  3. 目标值和有序序列元素进行比较;
  4. 当目标值大于有序序列元素,则和下一个元素比较;
  5. 当目标值小于等于有序序列元素,则将目标值插入至此此位置;
  6. 重复步骤2-5;

40e6a792e9d73e09106c5735cc138b07.gif

代码


function insertionSort(array) {
   
   
  let length = array.length;
  let preIndex, current;
  // 从第二个数开始循环
  for (let i = 1; i < length; i++) {
   
   
    // 当前数的前一个index开始对比
    preIndex = i - 1;
    // 当前需要插入的数据,用current空间参数存起来
    current = array[i];
    // 进入二次循环,该循环用来对比排序完成的数与当前需要插入的数据
    while (preIndex >= 0 && current < array[preIndex]) {
   
   
      // 因为当前值已经被抽出,它的序号比需要对比的数的最大序列大1,所以当满足条件,可以把preIndex + 1的序列的值赋值为 // preIndex
      array[preIndex + 1] = array[preIndex];
      // 继续循环
      preIndex--;
    }
    array[preIndex + 1] = current; // 外层完成一次循环后,把找到的当前小于current 的前一位数替换成插入元素
  }
  console.log('insertionSort result:', array);
}

insertionSort([9, 1, 0, 2, 3, 8, 6, 3]);

输出值
image.png

双for循环写法


function insertionSort2(array) {
   
   
  let length = array.length;
  let preIndex, current;
  // 从第二个数开始循环
  for (let i = 1; i < length; i++) {
   
   
    // 当前数的前一个index开始对比
    preIndex = i;
    // 当前需要插入的数据,用current空间参数存起来
    current = array[i];
    let twoCurrent;
    // 进入二次循环,该循环用来对比排序完成的数与当前需要插入的数据
    for (let j = i - 1; j >= 0; j--) {
   
   
      if (array[j] > current) {
   
   
        let temp = array[preIndex];
        array[preIndex] = array[j];
        array[j] = temp;
        preIndex = j;
      } else {
   
   
        break;
      }
    }
  }
  console.log('insertionSort2 result:', array);
}

insertionSort2([9, 1, 0, 2, 3, 8, 6, 3]);

输出值
image.png

复杂度

时间复杂度:O(n^2)
空间复杂度:O(1)

寄语

插入排序的应用场景很多,变种包括二分法排序,基础牢固才能更好的进行优化,加油吧,各位!

思考是进步的阶梯

目录
相关文章
|
2月前
|
前端开发 JavaScript 算法
使用 JavaScript 数组方法实现排序与去重
【10月更文挑战第21天】通过灵活运用 `sort()` 方法和 `filter()` 方法,我们可以方便地实现数组的排序和去重。同时,深入理解排序和去重的原理,以及根据实际需求进行适当的优化,能够更好地应对不同的情况。可以通过实际的项目实践来进一步掌握这些技巧,并探索更多的应用可能性。
106 59
|
1月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
91 8
|
1月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
96 7
|
2月前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
72 9
|
2月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
35 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
2月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
23 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
2月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
33 0
|
2月前
|
前端开发 JavaScript 索引
JavaScript 数组常用高阶函数总结,包括插入,删除,更新,反转,排序等,如map、splice等
JavaScript数组的常用高阶函数,包括遍历、插入、删除、更新、反转和排序等操作,如map、splice、push、pop、reverse等。
20 0
|
2月前
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析
|
2月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
78 0