输入n+1个整数,每个整数之间以空格进行分割,且前n个整数互不相同(输入采用scanf,a【i】形式)
1 每输出一个数字,随后要输出一个空格用于分割。
2 第一行输出:将输入的前n个整数由小到大进行排序后输出。
3 第二行输出:用折半查找法在输入的前n个数中找出输入的第n+1个数
①若能找到,输出该数是第一行排序后的第几个数。
②若找不到,输出“无此数”。
4 第三行输出:将输入的前n+1个整数由大到小进行排序后输出。
例如 输入
6 0 3 9 4 12 7
输出
0 3 4 6 9 12
无此数
12 9 7 6 4 3 0
#include<stdio.h>
int main()
{
int n = 0;
int a[10] = {0};
int i = 0;
int t = 0;
int num = 0;
int low=0;//初始状态 low 指针指向第一个数字
int high = 0;
int mid;
scanf("%d",&n);
high=n-1;//high 指向最后一个数字
for(int b = 0; b < n; b++)
{
scanf("%d",&a[b]);
}
scanf("%d",&num);
for(int b = 0; b < n; b++)
for(int c = 0; c < n - b - 1; c++)
{
if(a[c] > a[c + 1])
{
t = a[c];
a[c] = a[c+1];
a[c+1] = t;
}
}
for(int b = 0; b < n; b++)
printf("%d ",a[b]);
while (low<=high) {
mid=(low+high)/2;
if (a[mid]==num)//如果 mid 指向的同要查找的相等,返回 mid 所指向的位置
{
printf("\n%d",mid+1);
break;
}else if(a[mid]>num)//如果mid指向的数据大于num,则更新 high 指针的位置
{
high=mid-1;
}
//反之,则更新 low 指针的位置
else{
low=mid+1;
}
}
return 0;
}
先上结果,这个你不会我觉得你可能是这个折半查找不太会实现,这个我帮你写了一下,现在给你再说一下,就是我先用冒泡排序给数组排个序,然后输出,输出之后就折半查找,折半查找就是你把你输入的数据num去跟high和low的中间数去比较,如果中间值大于num那就说明在你数组的前半段,不然就在后半段,比方说在前半段,那你就把high移动到mid的上一个数据就是mid-1的位置,因为你的数据其实已经跟mid比较过了,所以移动到他上一个位置,然后在获取新的mid,就这样一直夹这个数,直到low>high就说明你这个折半折完了,结果如下
第二行输出要求没看懂,为什么会输出“1”呢?,nn又是什么意思?
第二行输出的是:第n+1个数在前n个数排序后位于第几个位置,如果有则输出,否则,无此数,样例中第n+1个数0是前n个数排序后的第一个。nn我猜是打错了,应该是n。