思想:将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.
注意:while循环中条件为左边小于等于右边
求平均值使用a+(a-b)/2计算防止溢出。并且此过程在循环体内部
代码:
#include<stdio.h>int main()
{ /* 0 1 2 3 4 5 6 7 8 9*/
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int left = 0;
int right = sizeof(arr)/sizeof(arr[0]) - 1;
int x = 7;
int mid = 0;
while (left <= right)
{
mid = left + (right - left) / 2;
if (arr[mid] == x)
{
printf("找到坐标为:%d\n", mid);
break;
}
else if (arr[mid]<x)
{
left = mid + 1;
}
else if (arr[mid]>x)
{
right = mid - 1;
}
}
if (left > right)
{
printf("找不到\n");
}
}