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);
  • 相关阅读:
    redis缓存穿透
    rocketmq配置文件两主两从
    jvm参数模板
    (转)volatile如何保证可见性
    Spring事务传播性与隔离级别
    Redis windows 远程连接配置修改
    Redis安装与配置( Windows10 或Windows server)
    C#中的虚函数及继承关系
    C#高级功能(三)Action、Func,Tuple
    WAMP配置httpd.conf允许外部访问
  • 原文地址:https://www.cnblogs.com/sunmarvell/p/9251167.html
Copyright © 2011-2022 走看看