利用不断取一半的方法提高程序效率,只能在有序数组中使用。
核心思路:
1.在长度为n的数组中,设定下标0为left,设定下标n-1为right,设定中间值为mid
mid = (left + right) / 2;
(需要注意的是,采用的是向下整除的方法,例如:9/2=4)
2.将mid与你想查找的数进行比较,如果mid大于查找的数,则left不变,right=mid-1,如果mid小于查找的数,则right不变,left=mid+1。直到找到你想要的数字
完整代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int left = 0;
int size = sizeof(arr) / sizeof(arr[0]);
int right = size - 1;
//中间值
int mid = (left + right) / 2;
int n = 0;
scanf("%d", &n);
//当left>right时,表明已经超出了数组的范围
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == n) {
printf("找到了,下标为 %d", mid);
break;
}
else if (arr[mid] < n) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return 0;
}
特殊情况:
如果数据过大,比如left=20亿,right=40亿。那么left+right则会超出范围,造成“溢出”
所以此时可以采用:
int mid = left+(right-left)/2;