//将n个从小到大排序的整数(n<1000000)从1~n进行编号,并一个待查找的整数m,请使用二分法进行查找。
#include<stdio.h>int main() {int n;scanf("%d", &n);int a[1000];//数组不能太大e6左右for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}int m;scanf("%d", &m);int left = 0, right = n - 1;// 不需要提前计算mid,因为它在循环中会更新int f = -1; // 标记是否找到,初始为-1(未找到)// 循环条件应该是 left <= right,而不是 left < right// 这样可以确保当 left 和 right 相等时,中间元素也会被检查while (left <= right) {int mid = left + (right - left) / 2; // 防止溢出,并且更新mid的值if (a[mid] > m) {right = mid - 1; // 缩小范围到左半部分,不包括mid} else if (a[mid] < m) {left = mid + 1; // 缩小范围到右半部分,不包括mid} else {f = 1; // 标记为已找到// 输出mid+1,因为题目要求从1~n编号,而数组是从0开始的printf("%d", mid + 1); break; // 找到后退出循环}}// 如果循环结束后仍未找到,则输出"None"if (f == -1) {printf("None");}return 0;
}
正常的查找肯定是要遍历一整个数组的,因为每一个数都可能是你要找的数,但二分查找可以通过不断更新边界来确定范围做到非常快,这种做法的思想性很好,但个人感觉实用性不好,因为使用二分法的前提是数组已经排好序了,如果遇到无序的数组,只能先排序再查找,可如果你先排好了序,那么你查找本身就失去意义了,因为待查找数本身的位置很可能已经被排序所改变了,所以真正的应用场景中,直接用find函数会更好