查詢演算法----折半(二分)查詢(視訊)
1.2、折半查詢
【基本思路】
折半查詢也稱為二分查詢,該方法是將給定值與中間位置記錄的關鍵碼比較,若相等,則查詢成功;若不等,則縮小範圍,直至新的查詢區間中間位置記錄的關鍵碼等於給定值或者查詢區間沒有元素時(表明查詢不成功)為止。
設查詢表的元素儲存在一維陣列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;
}