插入排序的进一步优化(折半查找)

本文介绍了一种改进的插入排序算法——折半插入排序。通过使用折半查找来确定待插入元素的正确位置,从而减少了不必要的比较次数。文章详细解释了算法的工作原理,并给出了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在插入的基础上将比较次数进行优化。。
 不需要跟有序序列的所有数据进行比较,每次都是跟其中的最中间的书进行比较,比中间的值大,则将查找区间缩短为它的后半部分,否则缩短为它的前半部分。如此不断重复进行。直至找到它的正确位置。。。然后将比他的有序数据都想后移动记录(都移动一位)。。将他插入到对应的位置。。。
void mildsort(int *a,int n)
{
    int i=0,j=0;
    int low=0,high=0,m=0;
    int temp=0;
    for(j=1;j<n;j++)
    {
        temp=a[j]  ;
        low=0 ;high=j-1;
        while(low<=high)    //折半查找部分。。。
        {
             m=(low+high)/2;
            if(temp<=a[m])   {high=m-1;};   //必须保函等于号,否则有相同的数据会陷入死循环
            else   low=m+1;
        }
       for(i=j;i>=low;i--)  {a[i]=a[i-1];};  //从第J个(也就是无序部分第一个开始逐一的向后移动一个位置,)
       a[low]=temp;  //将空出来的位置插入temp。
    }
   }

先将第一个数据看没有序序列,然后逐步扩大有序序列,缩短无序序列。
注意 :
在折半查找中(先不考虑有相同数据的情况)最终肯定是在两个数据中间,由于m的取值是向下取值(当缩减到两个数据时,m会指向low,则最后一次的比较一定会是low 与 m的值相比较即"temp>a[m]";low的最终会指向两个数据中较大的那个,估下一步需要从low 的值开始向后移动记录。。)
折半查找只是优化了查找的方式,查找的时间复杂度减少到?????。。。而插入的方式并没有改变时间复杂度依旧是O(nn);最坏的情况(全部逆序)移动次数为【n(n-1)】/2。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值