1 基本思想
二分法插入排序和上一篇的插入排序本质上没有区别,都是从无序序列中取出数据和有序序列进行对比,放到合适的位置。
区别在于:
1.1上篇的插入排序是逐个和有序序列进行对比
1.2因为有序序列是一个有序序列(废话),所以可以结合二分查找的方法,找到正确的位置,将元素插入。
关于二分查找,这里就不再详细描述了。
2 图示
略
3 代码
#include <stdio.h>
#include <string.h>
//type为0时为排序从小到大
int Insert2(int array[], int len, int type)
{
int i = 0;
int j = 0;
int value = 0;
int start = 0;
int end = 0;
int mid = 0;
for (i = 1; i < len; i++)
{
value = array[i];
start = 0;
end = i - 1;
while (start <= end)
{
mid = (start + end) / 2;
if (type == 0 ? (array[mid] > value) : (array[mid] < value))
{
end = mid - 1;
}
else
{
start = mid + 1;
}
}
//此时的start = end + 1的位置即为value的真正位置
for (j = i ; j >= start; j--)
{
array[j] = array[j-1];
}
array[start] = value;
}
return 0;
}
int main()
{
int array[] = {9,6,5,3,1,13,2,8,7,4,5,28,5,8,6,3};
int i = 0;
int t = sizeof(array)/sizeof(int);
Insert2(array, t, 1);
printf("array is:");
for (i = 0; i < t; i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
4 测试结果
#./test
array is:28 13 9 8 8 7 6 6 5 5 5 4 3 3 2 1
5 时间复杂度
二分插入排序和插入排序的复杂度一致,也是O(n^2)
二分插入排序是稳定的