简明算法: 插入排序(javascript描述)

插入排序的思路可以参考抓扑克牌:假定我们已有的扑克牌已经有序,现在抓了一张新牌,我们需要插入到适当的位置以保持队列依然有序。

插入排序

给定数组:

var list = [ 54269317773144885520 ];

算法描述:

  1. 当数组只有一个元素时,我们认为它有序(废话);所以起始从i=1开始,既抓第二张牌后,选择适当的位置;此时我们将第二张牌与第一张牌比较,由于26比54小,所以将54移动到第二个位置,最后将新牌既26放到首位,此时队列前两位有序:

    26549317773144885520 ]
  2. 现在i=2,既93与前一张比较,93比54大,所以不需要继续向前比较了,保持不动即可;因为前两位有序,93既然比54大,自然比54之前的任意元素大;此时队列前3位有序;

    26549317773144885520 ]
  3. 现在i=3,既17依次与前一张比较,17与93比较,将93移动到后一位;17与54比较,54移动到后一位;17与26比较,26移动到后一位;最后队列到达顶点,将17放到队首;此时队列前4位依然有序;

    17265493773144885520 ]
  4. 然后我们重复1、2、3步骤,直到整个数组有序;

    1轮: [ 26, 54, 93, 17, 77, 31, 44, 88, 55, 20 ]2轮: [ 26, 54, 93, 17, 77, 31, 44, 88, 55, 20 ]3轮: [ 17, 26, 54, 93, 77, 31, 44, 88, 55, 20 ]4轮: [ 17, 26, 54, 77, 93, 31, 44, 88, 55, 20 ]5轮: [ 17, 26, 31, 54, 77, 93, 44, 88, 55, 20 ]6轮: [ 17, 26, 31, 44, 54, 77, 93, 88, 55, 20 ]7轮: [ 17, 26, 31, 44, 54, 77, 88, 93, 55, 20 ]8轮: [ 17, 26, 31, 44, 54, 55, 77, 88, 93, 20 ]9轮: [ 17, 20, 26, 31, 44, 54, 55, 77, 88, 93 ]

算法实现:

function insert(list) {
  // 数组第一位有序,从第二位开始
  for (let i = 1; i < list.length; i++) {
    let t = list[i];
    let j = i - 1;
    // 从i-1依次向前遍历,因为i之前的队列有序,只要t比之前的元素小,都需要依次向后顺移一位
    for (; j >= 0 && t < list[j]; j--) {
      list[j + 1] = list[j];
    }
    // 不满足条件时 说明j要么为-1,要么list[j] >= t,所以赋值索引为j+1
    list[j + 1] = t;
  }
}

// 测试
var list = [ 54, 26, 93, 17, 77, 31, 44, 88, 55, 20 ];
insert(list);
console.log(list);
// [ 17, 20, 26, 31, 44, 54, 55, 77, 88, 93 ]
文章来源: 学什么好


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值