题目描述
两道题深刻理解二分查找(C++具有二分查找函数):
1.【问题描述】给定一个按值有序(升序)的N元整数数组A,采用折半查找法查找关键值k的位置,并给出查找的过程
【输入形式】
第一行:N
第二行:A[0], A[1], ... , A[N-1]
第三行:k
【输出形式】
第一行:k的位置(索引),若不存在则输出‘no’
第二行:查找的过程,每一次折半的中间(mid)位置的值,以逗号分隔。例如,1 2 3 4 5的中间位置为3,1 2 3 4的中间位置为2。
【样例输入】
样例1
11
2,5,8,11,15,16,22,24,27,35,50
22
样例2
11
2,5,8,11,15,16,22,24,27,35,50
10
【样例输出】
样例1
6
16,27,22
样例2
no
16,8,11
2.【问题描述】
使用折半查找法实现给定一个有序(非降序)数组A,可含有重复元素,求最大的i使得A[i]小于target,不存在则返回 -1
【输入形式】
第一行:非降序数组A
第二行:target
【输出形式】
2 4 6 7 8 8 9
9
【样例输入】
位置 i 或者 -1
【样例输出】
5
解题思路
二分查找参考博客:二分查找【详解】-CSDN博客
1.标准的二分查找,这里利用函数指针传递flag变量记录是否查询到并通过数组记录查询中间过程,二分查找时循环每次先求mid值并添加到记录数组中,由于mid索引不是待查找数据时可跳过所以mid-1或mid+1优化算法,有些时候mid=right-(right-left)/2避免临界情况。
2.同题一二分查找设计但由于查找小于输入数据的最大值,则可能输入数据不存在那么提前设定res=-1,那么未查找时循环必须进行到i<=j结束为止。
源代码
1---
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int BinSearch(int* arr, int k, int n,int *flag,int *num,int *count) {
int i = 0, j = n - 1;
int mid;
while (i <= j) {
mid = (i + j) / 2;
num[(*count)++] = arr[mid];
if (arr[mid] == k) {
return mid;
}
if (arr[mid] < k)
i = mid + 1;
else
j = mid - 1;
}
*flag = 0;
return 0;
}
int main() {
int arr[1000], n, i, num[100];
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", arr + i);
getchar();
}
int k, flag = 1, count = 0;
scanf("%d", &k);
int ans = BinSearch(arr, k, n, &flag, num, &count);
if (flag) {
printf("%d\n", ans);
for (i = 0; i < count; i++) {
if (i == 0)
printf("%d", num[i]);
else
printf(",%d", num[i]);
}
}
else {
printf("no\n");
for (i = 0; i < count; i++) {
if (i == 0)
printf("%d", num[i]);
else
printf(",%d", num[i]);
}
}
return 0;
}
二---
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int BinSearch(int* arr, int k, int n) {
int i = 0, j = n - 1;
int mid, res = -1;
while (i <= j) {
mid = (i + j) / 2;
if (arr[mid] == k)
res = mid - 1;
if (arr[mid] < k)
i = mid + 1;
else
j = mid - 1;
}
return res;
}
int main() {
int arr[1000], i = 0;
char ch;
while (1) {
scanf("%d", arr + i);
i++;
ch = getchar();
if (ch == '\n')
break;
}
int k;
scanf("%d", &k);
printf("%d", BinSearch(arr, k, i));
return 0;
}
总结
恭喜你掌握了二分查找算法,C++含二分查找函数upper_bound()和lower_bound(),小编也觉得很方便捏~