今天的每日一题是关于二分插入法
二分插入法题目:
目前有个已经正序排好的9个元素的数组,现在输入一个数,要求将这个数按原来排序的规律插入数组中。
输入:
第一行, 9个整数, 表示已经排好序的数组
第二行: 一个整数 表示需要被插入的数字
输出:
插入数字后的正序数组
(注意: 本题禁止使用排序)
具体代码如下:(代码标注很清楚供日后复习使用)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[15];//定义一个数组存储数字
int count = 0;//定义一个计数器用来存储数组元素个数
int i,j;//定义循环变量
int left,right,t;//定义区间的左边界和右边界,临时插入的数字t
int mid;//定义区间中间的数字
int n;//定义数字个数
printf("请输入数字个数:\n");
scanf("%d",&n);
count = n;
printf("请输入数字:\n");
for(i = 0;i < n;i++)
{
scanf("%d",&a[i]);;
}
printf("请输入要插入的数字:\n");
scanf("%d",&t);
for(i = 0;i < n;i++)
{
left = 0;//左边界
right = count - 1;//右边界
while(left <= right)//左边界要小于等于有边界
{
mid = (left + right) / 2;//中间位置
if(t >= a[mid])//输入的数字大于中间数字,表示这个数字在mid右区间
{
left = mid + 1;//左区间更新为mid的右边
}
else//输入的数字小于中间的数字,表示这个数字在mid左区间
{
right = mid - 1;//右区间更新为mid的左边
}
}
}
for(j = count - 1;j >= right + 1;j--)//循环结束后,插入的数字为right所在的位置,因此要将right后的数字向后移一位
{
a[j + 1] = a[j];//right后的数字向后移动一位
}
a[right + 1] = t;//将t插入right + 1的位置
printf("插入后的结果为:\n");
for(i = 0;i <= count;i++)
{
printf("%d\n",a[i]);
}
return 0;
}