优点:通过将数组分成两半减少搜索范围,从而决定定位目标元素
若规定int k=7; 即我们要找出数字7,即它的下标为6
数字 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
left | right |
- 第一次:left=0,right=9,mid=4
- mid=(left+right)/2 最好不要这样去写,因为容易数据溢出,可以这样写:mid=left+(right-left)/2
- 第二次:left=5,right=9.mid=7
- 第三次:left=5,right=6,mid=5
- 第四次:left=6,right=6,mid=6, 所以找到了下标6
#include<stdio.h>
int binary_search(int arr[], int sz, int k)
{
int left = 0;
int right = sz-1;//这里你出错,写成9了
while (left <= right)//这里你忘记写这一行了
{
int mid = left + (right - left) / 2;//为防止函数溢出,所以这样写,而不是写成mid=(left+right)/2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid == k])
{
return mid;
}
else
printf("找不到\n");
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = binary_search(arr, sz, k);
printf("找到了,下标为:%d\n", ret);
return 0;
}
运行结果是:
写作不易,若有疑问,请各位大佬多多指教!感谢!