折半插入排序算法在一定程度上可以提升插入排序的速度。
其思想是:每次把待排序元素与其前面已排好的序列的中值相比较,从而寻找最终插入的位置。找到插入位置之后将前面元素往后覆盖,随即再将待排元素插入。
举个例子:(一部分)
那么可以看到先将待排序元素放到临时变量中,将它前面已排好序列的低位置设为low=left,高位置设为 high=i-1,那么每次取的中值就是mid=(low+high)/2,然后用临时变量与arr[mid] 比较,在低位置小于等于高位置时,如果临时变量小于中值,则high=mid-1,反之low=mid+1。
当low>high的时候,就说明已找到插入位置。
代码实现如下:
//折半插入排序
void Sort(int *arr,int left,int right)
{
for (int i = left + 1; i < right; i++)
{
int temp = arr[i]; //用临时变量存放待排数据
int low = left;
int high = i - 1;
while (low <= high)
{
int mid = (low + high) / 2;
if (temp < arr[mid])
{
high = mid - 1;
}
else {
low = mid + 1;
}
}
for ( int j = i-1; j >= high + 1; j--)
{
arr[j+1] = arr[j];
}
arr[high + 1] = temp; //插入位置
}
}