1、程序文件
#include <stdio.h>
// 交换
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
// 打印
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
// 二分插入排序
void mySort(int *a, int len)
{
int i;
// i相当于边界,get之前的那个数
for (i = 1; i < len; i++)
{
// 新来的元素下标为i
int get = a[i];
// 待插入数组的左右边界
int left = 0;
int right = i-1;
// left总是从0开始,遍历整个小于其的区间
while (left <= right)
{
// 中间元素的下标
int mid = (left+right)/2;
// 将get 和中间元素进行比较,若get更小,则将get前移
if (a[mid] > get)
right = mid-1;
else
left = mid+1;
}
// 移位
int j;
// left指向从右至左的第一个比其小的数
// 从后往前移
for (j = i-1; j >= left; j--)
a[j+1] = a[j];
a[left] = get;
}
}
// 主函数
int main()
{
int a[] = {9,8,7,6,5,4,13,3,2,1,0};
int len = sizeof(a)/sizeof(a[0]);
mySort(a, len);
myPrint(a, len);
return 0;
}
2、测试结果
root@lj:/mnt/hgfs/shared-lj# gcc 二分插入排序study.c
root@lj:/mnt/hgfs/shared-lj# ./a.out
0 1 2 3 4 9 8 7 6 5