zoukankan      html  css  js  c++  java
  • 直接插入排序法原理及其js实现

    直接插入排序法就像我们打扑克牌时整理牌面一样,先让我们脑补一下我们打牌的过程。

    首先摸了一张6,

    接着摸到一张4,比6小,插到6的前面;

    又摸到一张7,比6大,插到6的后面;

    又摸到一张5,比6小,比4大,插到4和6中间;

    。。。。

    以上的过程,其实就是典型的直接插入排序,每次将一个新数据插入到有序队列中的合适位置里

    步骤:

    1.首先将数组第1个数看成是一个有序序列。

    2.将数组的第2个数按照关键字大小插入到这个有序序列中,插入后得到了一包含两个数的有序序列。

    3.接下来再重复上面的步骤将第3,第4……第n-1个数分别插入到该有序序列中,最终得到一个包含n个数的有序序列。

    很简单吧,接下来,我们要将这个算法转化为编程语言。

    假设有一组无序序列 R0, R1, ... , RN-1。

    (1) 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列。

    (2) 然后,我们要依次把 R1, R2, ... , RN-1 插入到这个有序序列中。所以,我们需要一个外部循环,从下标 1 扫描到 N-1 。

    (3) 接下来描述插入过程。假设这是要将 Ri 插入到前面有序的序列中。由前面所述,我们可知,插入Ri时,前 i-1 个数肯定已经是有序了。

    所以我们需要将Ri 和R0 ~ Ri-1 进行比较,确定要插入的合适位置。这就需要一个内部循环,我们一般是从后往前比较,即从下标 i-1开始向 0 进行扫描。 

    js代码实现

      let dat=[5, 8, 10, 3, 2, 18, 17, 9];
           function insertSort(data) {
            var  temp;//用于存储需要插入的数据
            //注意i从1开始,因为以j=i-1为基准数
            for(let i=1;i<data.length;i++){
                temp=data[i]; //将第i个数保存,以供之后插入合适位置使用
                // 因为前i-1个数都是从小到大的有序序列,只要当前比较的数(data[j-1])比temp大,就把这个数后移一位
                for(var j=i-1;j>=0&&data[j]>temp;j--){   //这块j得用var声明,因为在for循环之外的作用域还要用j
                    data[j+1]=data[j];
                }
                data[j+1]=temp;//将temp插入合适的位置
            }
            return data;       }    
    
            var sortedData=insertSort(dat);
            console.log(sortedData);
  • 相关阅读:
    unsupported jsonb version number 123
    如何在MPlayer上支持RTSP
    TDengine 时序数据库的 ADO.Net Core 提供程序 Maikebing.EntityFrameworkCore.Taos
    如何使用IoTSharp对接ModBus?
    如何从源码启动和编译IoTSharp
    Asp.Net Core 自动适应Windows服务、Linux服务、手动启动时的内容路径的扩展方法
    MQTTnet 的Asp.Net Core 认证事件的扩展
    Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
    The remote certificate is invalid according to the validation procedure 远程证书验证无效
    settings插拔式源码
  • 原文地址:https://www.cnblogs.com/sunmarvell/p/9251167.html
Copyright © 2011-2022 走看看