二分査找就是折半查找,其基本思想是:首先选取表中间位置的记录,将其关键字与给定关键字 key 进行比较,若相等,则査找成功;
若 key 值比该关键字值大,则要找的元素一定在右子表中,则继续对右子表进行折半查找:
若 key 值比该关键宇值小,则要找的元素一定在左子表中,继续对左子表进行折半査找。
如此递推,直到査找成功或査找失败(或査找范围为 0)。
折半查找,找到返回下标,失败返回-1
#include<stdio.h>
int BinSearch(int *arr, int len, int key)
{
int low = 0; // 数组的头,即数组的首元素
int high = len - 1; // 数组的末尾,即数组最后一个元素
int mid;
while (low <= high)
{
mid = (low + high) / 2;
if (arr[mid] == key) //找到了
{
return mid;
}
else if (arr[mid] < key) //在mid位置的右边找
{
low = mid + 1;
}
else
{
high = mid - 1; //在mid位置的左边找
}
}
return -1; //没找到,返回-1
}
int main()
{
int arr[] = { 1, 2, 3, 5, 7, 9, 10 };
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i<len; i++)
{
printf("%d\n", BinSearch(arr, len, arr[i])); //0 1 2 3 4 5 6
}
printf("%d\n", BinSearch(arr, len, 0)); //-1
printf("%d\n", BinSearch(arr, len, 4)); //-1
printf("%d\n", BinSearch(arr, len, 20)); //-1
return 0;
}
运行结果
这里有一个问题:在进入while循环时,判断条件可以是low<high吗?
答:不可以,理由如下:
假设一个数组中只有一个元素,那么此时low=high=mid=0;
如果去掉 = 的话,那就意味着low和high的值不能相等,low=high=mid不成立