插入排序之折半插入排序

来源:互联网 发布:淘宝水果店铺装修 编辑:程序博客网 时间:2024/06/06 17:25

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


    1     2     3     4     5  1     3     5      8    9         4low                       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).