Problem Description
显示出如下数组中的所有元素,并使用二分查找法在数组中查找元素。
int a[] = {-90, -32, 12, 16, 24, 36, 45, 59, 98, 120};
Input
输入所要查找的元素。
Output
- 输出数组中的所有元素。
- 输出该元素的位置以及二分查找的比较次数。
Sample Input
24
120
6
Sample Output
-90 -32 12 16 24 36 45 59 98 120
第5个元素为24,比较次数为1
第10个元素为120,比较次数为4
查找失败,比较次数为3
解题思路
- 直接默写二分查找代码模板,只不过需要记录比较次数。
经验总结
- 二分查找的while循环条件是left <= right,当left == right时,mid,left,right指向同一个元素,这个元素有可能为所要查找的元素。
- 只有left > right,即left和right错位,表示查找失败。
代码实现(C)
#include <stdio.h>
int a[] = {-90, -32, 12, 16, 24, 36, 45, 59, 98, 120};
// 二分查找代码
int binary_search(int left, int right, const int num, int *count) {
count = 0;
while (left <= right) {
int mid = (left + right) / 2;
count++; // count记录比较次数
if (a[mid] == num)
return mid;
else if (a[mid] < num)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
int main() {
int num;
// 输出数组元素
for (int i = 0; i < 10; ++i) {
if (i < 9)
printf("%d ", a[i]);
else
printf("%d\n", a[i]);
}
// 对输入元素进行查找及输出
while (~scanf("%d", &num)) {
int count;
int pos = binary_search(0, 9, num, &count);
if (pos >= 0)
printf("第%d个元素为%d,比较次数为%d\n", pos + 1, num, count);
else
printf("查找失败,比较次数为%d\n", count);
}
return 0;
}