js实现插入排序

插入排序:

思想:

每次将关键字插入到已经排好序的子集中

空间复杂度:O(1);
时间复杂度:最好,已经排序好的:O(n)
最坏,逆序:O(n^2)
则平均为:O(n^2)
稳定性:稳定

实现:

charuSort(){
var a = [53, 17, 78, 9, 45, 65, 87, 32];
// 每次将关键字插入到排好的子集中
for (let i = 1;i<a.length;i++) {
    if (a[i]<a[i-1]){ // 只有当前元素比上一个元素小的时候才进行元素的移动,所以要先判断大小
        let temp = a[i]
        for (var j =i-1;j>=0 && temp<a[j];j--) {
            a[j+1] = a[j] // 所有大于temp的元素都向后移动
        }
        a[j+1] = temp // 因为j 一直在 -- 所以这里是a[j+1] = temp
    }
}

},

带哨兵,相当于将a[0]空出来,元素从1-len
然后用a【0】替换temp
而且优点是,不用每轮循环都判断是否大于0

for (var j =i-1;j>=0 && temp<a[j];j–)
for (var j =i-1;&& a[0]<a[j];j–)
charuSort(){
var a = [53, 17, 78, 9, 45, 65, 87, 32];
// 每次将关键字插入到排好的子集中
for (let i = 2;i<=a.length;i++) {
    if (a[i]<a[i-1]){ // 只有当前元素比上一个元素小的时候才进行元素的移动,所以要先判断大小
        a[0] = a[i]
        for (var j =i-1;&& a[0]<a[j];j--) {
            a[j+1] = a[j] // 所有大于temp的元素都向后移动
        }
        a[j+1] = a[0] // 因为j 一直在 -- 所以这里是a[j+1] = a[0]
    }
}

},

优化:

折半查找

思想:先用折半查找,找到需要插入的位置,再进行插入,当low>high时,停止折半查找,然后将【low,i-1】全部右移动,将temp复制到low的位置;

当关键字与min所指的值相等时,为保证算法稳定性,防止后面还有相等的值,则不停止折半查找,继续再右边进行查找

charuSort(){
var a = [53, 17, 78, 9, 45, 65, 87, 32];
let low,high,mid;
// 每次将关键字插入到排好的子集中
for (let i = 1;i<a.length;i++) {
    let temp = a[i];
    low = 0;
    high =i;
    while (low <=high) {
        mid = (low+high)/2;
        if (a[mid] >temp){ // 判断大小,判断需要插入的位置再左表还是右表
            high = mid - 1; // 左表
        } else {
            low = mid +1; // 右表
        }
    }
    for (var j =i-1;j>=high;j--) {
        a[j+1] = a[j] // 所有大于temp的元素都向后移动
    }
    a[high+1] = temp // 因为j 一直在 -- 所以这里是a[j+1] = temp
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值