之间介绍插入排序时漏掉一种插入方式,那就是折半插入。
这种方式是采用二分查找法去查找插入点,可以减少元素比较次数,但是并不能减少移动次数,复杂度跟直接插入一样,都为O(n^2).
直接上代码:
//二分插入排序
void binary_insert_sort(int arr[],int len)
{
if(arr == NULL || len <= 1)
{
return;
}
int i,j;
for(i = 1; i < len; i++)
{
int low = 0,high = i-1;
int target = arr[i];
while(low <= high)
{
int middle = low + ((high - low)>>1);
if(arr[middle] > target)
{
high = middle-1;
}else
{
low = middle+1;
}
}
//low的位置正好是插入点
//i与low之间的元素后移一位(不包括i)
for(j = i; j>low; j--)
{
arr[j] = arr[j-1];
}
//将target插入到正确位置
arr[low] = target;
}
}