直接插入排序算法在待排序序列比较短时,比较使用,但是到序列比较长时,其效率就差些了,为了提高效率可以对插入排序算法进行适当的改进,可以从减少比较和移动的次数入手,当将第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).