插入排序之折半插入排序

直接插入排序算法在待排序序列比较短时,比较使用,但是到序列比较长时,其效率就差些了,为了提高效率可以对插入排序算法进行适当的改进,可以从减少比较和移动的次数入手,当将第i个数插入前i-1的有序序列的时候,可以利用折半查找的方式确定最终的插入位置,从而就会减少比较的次数。这种排序算法我们就称作折半插入排序算法。


    1     2     3     4     5

  1     3     5      8    9         4
low                       high
               high
        low
               low
     low = high = 3  4要插入的位置就是位置3


算法


void  BinsSort(RecType R[],int n)

{

for(i=2;i<=n;i++) 

{

R[0] = R[i];

low=1; high = i-1;

     while(low<= high)//折半查找要插入的位置

{

m=(low+high)/2; 

if(R[0].key < R[m].key)

{

high = m-1;

}

else

{

low = m+1;

}

}

for(j = i-1;j>=high+1;j--)  //这个循环是将待排序的数字插入到相应的位置,与直接插入排序一样,移动的位置是一样的

{

R[j+1] = R[j];

    }

   R[high+1] = R[0];

}

}


总结:由于折半查找只是缩短了待查找数的比较次数,但是移动的次数还是和直接插入排序是一样的,

因此其时间复杂度仍然为o(n2).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值