首先,我们要聊一下什么是二分查找,二分查找只适用于有序表,举个例子,一个元素1-10的数组,我要你找到元素7所在的位置,通过我们人眼观察,你可能一下子就可以找到。但是计算机这个东西,它很呆的,如果你不给予它更好的算法,它就真的会一个接一个地按顺序遍历。那么计算机就要查找七次,但是如果用了二分查找,则可以减少查找次数。
再之后,我们找left和right中间位置的元素。
此时,我们要找的元素7比mid下标所指的元素大,所以我们可以缩小范围,只在mid~right这个区间里找元素。
此时,继续上面 mid=(left+right)/2 的步骤。
此时,下标mid指向的元素8比7大,所以,我们可以进一步缩小范围,只在left~mid的区间里寻找。
此时,继续上面 mid=(left+right)/2 的步骤。
此时,mid指向的元素比7小,所以在mid的右边找。
此时,继续上面 mid=(left+right)/2 的步骤。
而此时mid下标指向的元素和7相等,则找到了。
如果,最后left>right,则说明,有序表中没有该元素。
我们可以看到,原来的需要7次查找的情况被减少到了4次。如果说这个元素更多的话,二分查找的优越性就体现出来了。
代码实现
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,下标是%d\n", mid);
break;
}
}
if (left > right)
{
printf("查询失败\n");
}
return 0;
}