折半查找法,是一种效率比较高的查找法,该算法对待查找的列表有两个要求:①采用顺序存储结构;②关键字必须按大小有序排列
算法的基本思想是:
- 将待查找的关键字(记为key)与被查找的表中间位置的关键字进行比较;
- 若该关键字比key大,取列表的前一半,继续步骤1;
- 若该关键字比key小,取列表的后一半,继续步骤1;
- 若与key相等,则查找成功,并返回该元素在列表中的小标;
程序代码如下:
//arr为一个满足折半查找要求的列表,length为表长,key为待查找关键字
int BinSearch(int *arr, int length, int key)
{
int left = 0;
int right = length - 1;
int mid;
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1; //此语句不排除mid可能会出现死循环!
}
else
break;
}
if (left <= right)
{
printf("找到了,下标是%d\n", mid);
return mid;
}
else
printf("查找失败!\n");
return 0;
}
该算法可以节省大量的查找时间,最坏的查找情况是待查找元素位于表的两端或者表中不存在待查找元素,设此时比较了n次,则表长至少为 2n-1,设表长为L,则该算法的查找次数最多为⌊log2L⌋+1。