二分插入排序在二分排序基础上进行改进,将抓到的牌与之前抓到的已排好序的牌的中间一张进行比较,缩小比较范围,减少比较次数
将数组 a[10] = {7,2,9,4,1,3,8,6,5,0} 从小到大排序并打印结果
打印函数
void printA(int *a,int len)
{
int i;
for(i = 0; i < len; i++)
{
printf("%4d",a[i]);
}
printf("\n");
}
二分插入排序
void insert(int *a, int len)
{
int i,j,left,right,mid,get;
for(i = 1; i < len; i++)
{
get = a[i];
left = 0;
right = i-1;
//找插入位置,查找完后要插入的位置为下标为left的位置
while(left <= right)
{
mid = (left+right)/2;
if(a[mid] > get) //要插入的位置在mid的左边
{
right = mid-1; //右边界变为mid-1
}
else //要插入的位置在mid的右边
{
left = mid+1; //左边界变为mid+1
}
}
//移位:找到要插入的left位置后,将left开始右边的元素依次右移一位
for(j = i-1; j >= left; j--)
{
a[j+1] = a[j];
}
a[left] = get; //插入新元素
}
}
main函数调用
int main()
{
int a[10] = {7,2,9,4,1,3,8,6,5,0};
int len = sizeof(a)/sizeof(a[0]);
insert(a,len);
printA(a,len);
return 0;
}