经典算法学习(一)排序之二分插入排序

算法即内功

二分插入排序基本思想:
思想和插入排序是一样的,只是在寻找插入位置时不一样。普通插入排序在寻找插入位置时从已有序的序列从尾到头遍历寻找插入位置。这样的遍历就会浪费大量的时间去比较。
这里我们其实应该很容易就能想到这种优化思想。因为待插入的是有序序列。我们为何不用更快的方法来寻找插入位置呢。在查找中我们学习了二分查找。正是要在序列有序的情况下使用。所以我们也采用这种思想去寻找插入位置,可以大量减少比较时间。

示例
在这里插入图片描述
如果是普通插入排序的话。25需要比较5次才能找到插入位置。而二分插入只需要比较四次。有优势的。
代码:

void insertSort(int a[],int n)
{
    int low,high,mid,temp;
    for(int i=0;i<n;i++)
    {
        low=0;
        high=i-1;
        mid=(low+high)/2;
        temp=a[i];
        while(high>=low)//high>=low继续寻找
        {
            if(temp>a[mid])//改变low和mid
            {
                low=mid+1;
                mid=(low+high)/2;
            }
            else//改变high和mid
            {
                high=mid-1;
                mid=(low+high)/2;
            }
        }
        for(int j=i;j>low;j--)//把temp放到找到的位       {
            a[j]=a[j-1];
        }
        a[low]=temp;
    }
    return;
}

这里其实有个问题的,为什么判断条件是>=而不是>,还有为什么都会放在low 的位置。也是值得细细思考的。希望有大佬评论告诉一下。

分享几张阔爱的娃娃头像!!!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

哈哈哈,好看吧!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值