資料結構與演算法 折半查詢演算法(二分法)

2021-07-04 11:32:52 字數 1409 閱讀 3841

如果從檔案中讀取的資料記錄的關鍵字是有序排列的,則可以用一種效率比較高的查詢方法來查詢檔案的記錄,這就是折半查詢法,又稱為二分法搜尋。

折半查詢的基本思想是:

減小查詢序列的長度,分而治之地進行關鍵字的查詢。

假設陣列元素呈公升序排列。

將 n 個元素分成個數大致相同的兩半,取 a[n/2] 與欲查詢的 x 作比較,

如果 x 

=a[n/2] 則找到x,演算法終止。

如果 x 

<

a[n/2],則我們只要在陣列 a 的

左半部繼續

搜尋 x。

如果 x 

>

a[n/2],則我們只要在陣列 a 的

右半部繼續

搜尋 x。

折半查詢的實現過程是:

先確定待查詢記錄的所在範圍,然後逐漸縮小這個範圍,直到找到該記錄或查詢失敗(查無該記錄)為止。

例如有序列:7   14   18   21   23   29   31   35   38    52(該序列包含 10個元素,而且關鍵字單調遞增。),現要求查詢關鍵字 key 為 38 的記錄。

我們可以設指標 low 和 high 分別指向關鍵字序列的上界和下界,指標 mid 指向序列的中間位置,即 mid = (low+high)/2。

7   14   18   21   23   29   31   35   38    52

↑ low                    ↑ mid                            ↑ high

(mid=(low+high)/2)

迴圈實現:

int binarysearch(type a,const type& x,int n)

return -1;

}

遞迴實現:

int binary_search(record *r, const int &low, const int &high, const key &k)

else if(low == high)

else

return -1;

}

迭代實現:

int binary_search(record *r, const int &size, const key &k)

if (low > high)

return -1;

else

}

二分查詢演算法(折半查詢演算法)

二分查詢也叫折半查詢,是每次查詢集合中的一半。1 arr 3,5,10,20,22,26,55,59,63,68 如上所示陣列,如果現在要查詢68所在的位置,使用遍歷比較的話,最壞情況需要查詢10次,而如果使用二分查詢演算法的話,只需比較3次就能找到,大大提高了查詢效率。當然,數量小的陣列可能看不出...

資料結構與演算法 二分查詢

二分查詢的思想是在已經排序 公升序 的陣列中,如果要查詢的數比中位數小,那麼其位置只可能在左半部分,相反只能在右半部分。這樣每次把查詢區間縮小一半,比順序查詢效率快得多。非遞迴寫法 public static int binarysearchinasclooply int nums,int star...

資料結構與演算法,二分查詢

1.時間複雜度 每次能去掉一半即 logn 2.實現方式 while迴圈 與 遞迴 我更推薦 while 迴圈,因為遞迴有個潛在的問題就是 stack over flow 堆疊溢位 而且在實際工程中是盡量避免遞迴的。雖然遞迴寫起來方便,也不容易出錯。3.實現關鍵點 我總結了下,一共有以下四點 sta...