插入排序的基本操作是 “有序插入”,也就是将元素按照大小的排布逐一插入到一个有序的数组中。对于数组a[n]通常认为a[0]为长度为1的有序数组,然后按照有序插入法,将后面的数组元素逐一插入到有序组中,这样一来,有序组的长度将不断增长,最后到达整个数组的长度,即整个数组为有序组,至此排序完成。
用二分查找法查找为元素a[i]查找有序位置时,需要找到 “有序位置” 之后将那些大于a[i]的元素一起右移;相较于直接插入排序,二分插入排序只是减少了比较次数,但元素的移动次数并没有改变,在最坏的情况下时间复杂性仍是 O(n^2)
C语言实现代码如下:
void Binary_Inert_Sort(int arr[], int len)
{
int left, right, middle, temp;
int index;//index:需要查找的有序位置的索引
int i, j;
//控制插入的元素,第一次从下标为1的元素开始
for (i = 1; i < len; i++)
{ //将前面arr[0]的当成已经排好序的数列,然后逐个插入
left= 0;
right= i - 1;
temp = arr[i];
index = i;
//与头尾相比较如果没在范围内跳过循环
if (arr[0]<temp&&arr[i - 1]>temp)
{
//二分法查找插入位置
while (left<= right)
{
middle = (left+ right) / 2;
if (arr[middle] > temp) right= middle - 1;
else left= middle + 1;
}
//最后确定位置index
index = left;
}
//如果比第一个元素还小就直接插到第一个位置
if (arr[0] >= temp) index = 0;
//如果比最后一个元素还大直接插到最后一个位置
if (arr[i - 1] <= temp) index = i;
//向后移位腾出插入空间
for (j = i - 1; j >= index; j--) arr[j + 1] = arr[j];
arr[index] = temp; //插入
}
}