与直接插入相比减少了比较次数 复杂度不变 n2
主要步骤:
1.找到要插入的位置
2.插入数据(设计到元素的移动)
在其它地方找到这个图例方面理解
#include <stdio.h>
void binaryInsertSort(int *,int);
void showArray(int * array,int len);
void main()
{
int len = 12;
int array[12] = { 5, 3, 6, 2, 1, 9, 4, 8, 7,-20,-100,33};
printf("排序前:");
showArray(array,len);
binaryInsertSort(array, len);
printf("排序后:");
showArray(array,len);
}
//输出数组信息
void showArray(int * array,int len)
{
int i;
for(i=0 ; i<len; i++)
{
printf("%d ",array[i]);
}
printf("\n");
}
//折半插入排序
void binaryInsertSort(int * array,int len)
{
int i=1;
int j;
for(;i<len; i++)
{
if(array[i] < array[i-1])//如果 第i个元素小于前一个元素
{
//缓存第i个元素 【待插入的数据】
int temp = array[i];
//记录搜索范围边界
int low = 0;
int high = i - 1; // 0 到 high 是 array[i] 前面的所有元素
while(low<=high)
{
//记录中间位置
int mid = (low + high) / 2;
//比较中间元素和当前第i个元素的大小 ,以此来再次缩小比较范围
if(array[mid]>temp)// i mid
{
high= mid - 1;
}
else
{
low = mid + 1;
}
}
//执行到此处 说明已找到元素要插入的位置[low或者 high+1] 将low 到 i 处数据整体向后移动1位
for(j= i ;j>low; j--)
{
array[j] = array[j-1];
}
array[low]=temp;
}
}
}