二分查找(Binary Search)也叫作折半查找。二分查找有两个要求,一个是数列有序,另一个是数列使用顺序存储结构(比如数组)。
用传统的办法来查找一个有序数列的位置,需要对数列进行一个遍历,查找的效率也比较低。
如下示例,为传统的办法来进行查找数列位置,如果找到数字较大,对资源消耗也大。
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
//在一个有序数组中查找具体的某个数字n
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]); //计算元素的个数
for (i = 0; i < sz; i++)
{
if (arr[i] == k)
{
printf("找到了,下标是:%d\n", i);
break;
}
}
if (i == sz)
{
printf("找不到\n");
}
return 0;
}
于是,就引入了二分查找,二分查找的最大次数也就是用公式来求出
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
//在一个有序数组中查找具体的某个数字n
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]); //计算元素的个数
int left = 0;
int right = sz - 1;
while (left <= right)
{
//int mid = (left + right) / 2;//可能会出现值溢出的情况,求出的平均值可能有误
int mid = left + (right - left) / 2;//使用这种方式就不会出现溢出的情况
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}