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)
二分插入排序是穩定的