直接插入排序法原理及其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);

 

posted @ 2018-07-01 20:25  sunmarvell  阅读(638)  评论(0编辑  收藏  举报