二分法
对于一个有序数列的查找问题;强调数列有序。
为什么需要二分法
以往我们在一个数列里查找一个值我们会用for循环查找,这样十分有效,但是虽然说现在计算机性能能强大 但是资源也不能无故浪费,或者说在比赛中写题时可能会出现 **time limited error。
for循环为O(n) 而 二分法为O ( \log_2 10)
思想
类似于猜数
假设在1~100 中 猜60
第一次 50 反馈 小了;每一次都取中间值
第二次 75 反馈 大了;
第三次 62 反馈 大了;
第四次 56 反馈 小了;
第五次 59 反馈 小了;
第六次 60 反馈 正好; 输出60;
#include <stdio.h>
int erfen (int d[], int target, int left, int right)
{//第二个参数是要找的数,返回下标
int mid;
while (left <= right)
{
mid = (left + right) / 2;// 也可写成 m = left + ( right - left) / 2;
if (target < d[mid])
right = mid - 1;
else if (target > d[mid])
left = mid + 1;
else{
break;
}
}
return mid;
}
int main(void)
{
int b[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
int c = erfen(b, 4, 1, 9);
printf("%d\n", b[mid]);
return 0;
}