任务描述
本关任务:有15个数按小由到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数在数组中的下标。
相关知识
顺序查找法,不要求被查找的数组元素事先是有序排列的;折半查找要求被查数组是有序的。
若初始查找区间为R[low …… high]
,循环条件为low <= high
,首先选取位于数组中间mid
的元素,将其和待查找的数进行比较,如果它们的值相等,则查找成功,退出循环,否则根据比较的结果确定下次查找的范围是在数组的前半部分R[low …… mid-1]
还是后半部分R[mid+1 …… high]
,然后在新的查找范围内进行同样的查找,如此重复下去,直到查找成功或循环条件不满足退出循环。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入: 19
预期输出: 查找区间下界,上界,中间点[0,14,7]
查找区间下界,上界,中间点[0,6,3]
查找区间下界,上界,中间点[4,6,5]
查找成功,19的下标:5
测试输入: 4
预期输出: 查找区间下界,上界,中间点[0,14,7]
查找区间下界,上界,中间点[0,6,3]
查找区间下界,上界,中间点[0,2,1]
查找区间下界,上界,中间点[0,0,0]
查找成功,4的下标:0
测试输入: 10
预期输出: 查找区间下界,上界,中间点[0,14,7]
查找区间下界,上界,中间点[0,6,3]
查找区间下界,上界,中间点[0,2,1]
查找区间下界,上界,中间点[2,2,2]
查找区间下界,上界[2,1],查找失败
#include<stdio.h>
#define N 15
int main() {
int high = N - 1, i, x, low = 0, mid, a[N]={4,9,14,16,17,19,28,33,42,51,64,75,84,91,100};
scanf("%d", &x);
while (low <= high) {
mid = (low + high) / 2;
printf("查找区间下界,上界,中间点[%d,%d,%d]\n", low, high, mid);
if (a[mid] == x) {
printf("查找成功,%d的下标:%d\n", x, mid);
return 0;
} else if (a[mid] < x) {
low = mid + 1;
} else {
high = mid - 1;
}
}
printf("查找区间下界,上界[%d,%d],查找失败\n", low, high);
return 0;
}