折半插入排序算法是对直接插入排序算法的简单改进,主要将折半比较的思想引入插入排序,在一定程度上提高了直接插入排序的效率。
一、思路
(1)每次插入,都从前面的有序子表中查找出待插入元素应该被插入的位置;
(2)给插入位置腾出空间,将待插入元素复制到表中的插入位置。
二、代码
从小到大
int BinaryInsertSort()
{
int i,j,low,high,mid;
for (i = 2; i < iCount; i++)
{
iRawBuff[0] = iRawBuff[i];
low = 1;
high = i -1;
while (low<=high)
{
mid = (low+high)/2;
if(iRawBuff[0] > iRawBuff[mid])
low = mid +1;
else
high = mid -1;
}
//找到high,high+1就是i要插入的位置
for(j = i-1; j>= high + 1; j--)
{
iRawBuff[j+1] = iRawBuff[j];
}
iRawBuff[j+1] = iRawBuff[0];
/*printf("第%d趟:\n",i-1);
for(int k = 0; k < iCount; k++)
{
std::cout<<iRawBuff[k]<<"\t";
}
std::cout<<std::endl;*/
}
return 0;
}
三、直接插入排序算法分析
仅仅是减少了比较元素的次数(最大为log2底n+1)而元素的移动次数没有改变(最大为n*(n-1)/2),它依赖于待排序表的初始状态。因此,折半插入排序的时间复杂度仍然为O(n²),但它的效果还是比直接插入排序要好。