原理:(本篇以升序排列)
先将数组从按一定顺序排列好,然后找到左值和右值,取中值与要查询的数进行比较,如果小于查询的数,那么就让左值等于中值,反之则右值等于中值。若找到了查询的数,则返回数组下标,否则输出没找到。
小tip:
因为left+right的值会超过类型的限制,所以mid的求法可用mid=left+(right-left)/2来保证不超过界限。
具体实现如下:
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
int main()
{
//有序序列
const int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
//例如二分查找7的下标
int key =7;
//二分查找
int left = 0;
int right = sizeof(arr) / sizeof(arr[0])-1;
_Bool flag = false;//用以判断是否找到下标
while (left <= right)
{
//int mid = (left + right) / 2;
int mid = left + (right - left) / 2;
if (arr[mid] == key)
{
printf("找到了key,其下标为%d", mid);
flag = true;//标记找到了
break;
}
else if (arr[mid] > key)
{
//说明所要查找的数据比mid小
right = mid - 1;
}
else
{
//说明所要查找的数据比mid大
left = mid + 1;
}
}
if (!flag)
{
printf("没有找到key");
}
return 0;
}