二分查找是一种高效的查找算法,但是有一个很重要的限制:数组必须要有序,不一定要连续,但是一定要有序。
我们看一个例子:在12345678910中找到自己需要的数字:
//函数实现二分查找
int Binary_search(int arr[], int a, int sz)
{
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;//这样的中间值让代码更扛造
if (arr[mid] > a)
{
right = mid - 1;
}
else if (arr[mid] < a)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int a = 0;
int sz = sizeof(arr) / sizeof(arr[1]);
scanf("%d", &a);
if (Binary_search(arr, a, sz) == -1)
{
printf("没找到");
}
else
{
printf("找到了,下标是 %d", Binary_search(arr, a, sz));
}
}
二分查找就是每次都是一半,一半的找。 找到数组的第一个下标和最后一个下标,得到中间的下标,每次用中间下标的值,对比想要找的值,中间值比想要的值小,就把第一个下标改到中间下标的后一个下标上,再比较中间值和想要的值,如果中间值比想要值大,就把最后一个下标改到中间下标的前一个下标上,再比较中间值和想要的值。然后循环下去,直到找到了或者没找到。
中间值比想要的值小:
中间值比想要的值大:
ps:我们算中间值的方法有很多种,我这里用的方法可以让代码数字小点,扛造一点。