#include<stdio.h>
//int binary_search(int arr[10], int find)
//{
// int left = 0;
// int right = 10 - 1;
// while (left < right)
// {
// int mid = (left + right) / 2;
// if (arr[mid] > find)
// right = mid - 1;
// else if (arr[mid] < find)
// left = mid + 1;
// else
// return mid;
// }
// return -1;
//}
int binary_search(int arr[10], int find)
{
//使用计算查找的次数
int left = 0;
int right = 10 - 1;
int count = 0;
while (left <= right)
{
count++;
int mid = (left + right) / 2;
if (arr[mid] > find)
right = mid - 1;
else if (arr[mid] < find)
left = mid + 1;
else
{
printf("count=%d\n", count);
return mid;
}
}
printf("count=%d\n", count);
return -1;
}
int main()
{
//二分查找必须数组中的数据是单项递增或递减
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("请输入要查找的数:>");
int find;
scanf("%d", &find);
//在这里如果不知道数组有多少个数,可以使用sizeof计算并传参传过去,
//但是不能把数组传过去再计算,因为数组传参传过去的是首元素的地址,
//计算得到的就是它的类型的字节数
int ret = binary_search(arr, find);
if (ret == -1)
printf("查不到此数\n");
else
printf("该数的下标是:%d", ret);
return 0;
}
二分查找使得查找一个数变得十分简便,二分查找的一个固定规则就是这个数组必须是顺序的,比如说“1,2,3,4,5,6,7,8,9,10”这个数组,要查找‘7’:
left记录最左边的下标,right记录最右边的下标,第一次查找mid=4,找到数字5,比7小,所以就让left=mid+1,表示要查找的那个数可能在mid的右边;第二次查找mid=7,找到数字8,比7大,所以right=mid-1,表示要查找的数可能在mid的左边;以此类推,直到找的了这个数,就返回它的下标,或者找不到,导致left>right,此时就返回-1,表示查不到此数。
count的意思是表示查找的次数
如图,就是查找到了7,它的下标是6,查找的次数是4
要注意循环的条件是left<=right,就像我举的例子,在这样的情况中就出现了left==right的情况
接下来我改一下数组的值,改成“1,2,3,4,5,6,7,9,10,11”,在这个数组中查找‘8’
int arr[10] = { 1,2,3,4,5,6,7,9,10,11 };
如图所示,查找了四次,但是最终left>right,就返回了-1,最终打印“查不到此数”。