折半插入排序,折半插入排序在直接插入的基础上进行改进,考虑到直接插入排序将很多开销放在比较和数据移动上。比较是不可避免的,有没有什么办法可以减少比较的次数呢?至少不要像现在这样挨个去比吧?于是想到在前面查找算法中的折半查找法,迅速翻书回去看看。考虑到这样一种情况,当第i个元素要进行排序的时候,它前面的1到i-1位置上的数据是局部有序的,对于有序的数据序列,采用折半查找法去判断在何处插入i位置上的数据,就大大减少了需要比较的次数。意思就是这样了,上代码,截图。最后hight就是要插入的位置。折半插入排序不会减少数据的移动次数。
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;
}