一、折半插入排序
实质上是插入排序,只是在搜索位置的时候用到二分查找。
二、算法实现
int sqTable[] = { 0,49,38,65,97,76,13,27,49};//其中[0]位置储存的是哨岗
int length = (sizeof(sqTable) / sizeof(int))-1;//不要第一个位置
void PrintTable(){
for (int i = 1; i <= length; i++)
{
printf("%d:", sqTable[i]);
}
printf("\n");
}
//折半插入排序=========================
void BInsertSort(){
for (int i = 2; i <= length; i++)
{
//相对直接插入排序 在找j的位置利用了折半查找
//哨岗位置赋值
sqTable[0] = sqTable[i];
int low = 1;
int high = i - 1;
//int index;
//用二分查找寻找index的位置
while (low <= high)
{
int mid = (low + high) / 2;
if (sqTable[0] < sqTable[mid])
{
//左半边
high = mid - 1;
}
else
{
//右半边
low = mid + 1;
}
}
//找到j该在的位置 进行插入从[index....i]向后移动一格子
for (int k = i-1; k >= high+1; k--)
{
sqTable[k + 1] = sqTable[k];
}
sqTable[high + 1] = sqTable[0];
}
}