1.2、折半查找
资讯网址:www.qghkt.com
腾讯课堂:https://qghkt.ke.qq.com/20个常用算法
【基本思路】
折半查找也称为二分查找,该方法是将给定值与中间位置记录的关键码比较,若相等,则查找成功;若不等,则缩小范围,直至新的查找区间中间位置记录的关键码等于给定值或者查找区间没有元素时(表明查找不成功)为止。
设查找表的元素存储在一维数组arr[1..n]中,那么在表中的元素已经按关键码非递减排序的情况下,进行折半查找的具体步骤:
① 将key与表arr中间位置(下标为mid)的记录的关键码进行比较,若相等,则查找成功。
② 若key>arr[mid].key,则说明待查记录只可能在后半个子表arr[mid+1..n]中,下一步应在后半个子表中再进行折半查找;
③ 若key<arr[mid].key,说明待查记录只可能在前半个子表arr[1..mid-1]中,下一步应在arr的前半个子表中进行折半查找。
④ 重复①②③步骤,直到查找成功或子表为空时失败为止。
【适用场景】
顺序存储、且有序的序列
【图解过程】
1)命中的情况图例
2)未命中的情况图例
【查找长度】
平均查找长度为:
一棵高度为h二叉树上,结点总数为n;有公式:
【算法代码】
/****************************************************************
* 函数名称:binarySearch
* 功能描述:折半查找/二分查找
* 参数说明:
* 参数说明:arr, 顺序表
* nLen,顺序表的表长
* value,所要查找的值
* 返回 值:如果存在,就返回所在表中的位置,如果不存在,返回-1
* 作 者:www.qghkt.com
* 创建时间:
*****************************************************************
* Copyright @ 清哥好课堂 All rightsreserved
*****************************************************************/
intbinarySearch(int arr[], int nLen, int value)
{
int low = 0;
int high = nLen - 1;
int mid;
while (low<=high)
{
mid = (low + high) / 2;
if (arr[mid] == value)
{
return mid;
}
else if (value < arr[mid])
{
//在左边查找
high = mid - 1;
}
else
{
//在右边查找
low = mid + 1;
}
}
//没有找到
return -1;
}