目录
思路分析
表达有序数组:arr[ ]={1,2,3,4,5,6,7,8,9,10};
假定查找数字5,需要知道5在数组arr[ ]中的下标,下标应为4,即arr[4]
求数组元素个数:int sz = sizeof(arr) / sizeof(arr[0]);//数组空间的大小除以数组一个元素的大小
最左边下标表示为:int left = 0;
最右边下标表示为:int right = sz-1;//数组元素个数-1
查找数:k;
二分中间下标:mid;
二分中间数:arr[mid];
每一次二分查找时,找到中间下标,用中间下标 mid 表示的数字 arr[mid] 与查找数 k 比大小。
若arr[mid]>k,继续二分查找,则右下标向左移动,right = mid-1;
若arr[mid]<k,继续二分查找,则左下标向右移动,left = mid+1;
若arr[mid]=k,那么就找到了数字k。
注意,这一切的前提是left<=right;若left>right,则不可能找到k。
上代码
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz-1;
int k = 0;
scanf("%d", &k);
while (left<=right)
{
//int mid = (left + right) / 2;
int mid = left + (right - left) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right)
printf("找不到\n");
return 0;
}
可以看见,除了我们知道的(left+right)/2=mid,还有一种方法求mid,如下图
int mid = left + (right - left) / 2;