#include<stdio.h>
/*
这个其实是对直接插入排序的优化
在搜索上用二叉搜索 而不是一个个比较 当n较大时,比直接插入排序的最大比较次数少得多
二叉直接插入排序和二叉排序树还是有点不同的...二叉排序树排序是通过构造排序二叉树实现的
*/
void print(int *a){
int i;
for(i = 0; i < 7;i++){
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
int BinarySearch(int * array, int start, int end, int k)
{
while (start <= end)
{
int middle = (start + end) / 2;
int middleData = array[middle];
if (middleData > k)
{
end = middle - 1;
}
else
start = middle + 1;
}
return start;
}
void InsertSort(int *array, int length)
{
int i, j;
for (i = 1; i < length; i++)
{
if (array[i]<array[i - 1])
{
int temp = array[i];
int insertIndex = BinarySearch(array, 0,i, array[i]);//使用二分查找在有序序列中进行查找,获取插入下标
for (j = i - 1; j>=insertIndex; j--) //移动元素
{
array[j + 1] = array[j];
}
array[insertIndex] = temp; //插入元素
}
printf("第 %d 趟排序:",i);
print(array);
}
}
int main(){
int i,j,temp;//flag = 0 也可以使用标志
int a[8] = {95, 45, 15, 78, 84, 51, 24, 12};
printf("原序列:");
print(a);
InsertSort(a, 8);
printf("排序后元素如下:");
print(a);
return 0;
}