演算法之二分查詢法

2022-05-26 01:18:13 字數 1584 閱讀 6829

1.什麼是二分查詢法

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。(from baidu baike)

2.二分查詢的演算法要求

①.資料必須有序排列;

②資料必須順序儲存。

3.二分查詢的時間複雜度

o()=o(logn)

4.二分查詢的實現原理

被查詢的資料要先按順序(這裡是從小到大)儲存在陣列a裡,並且知道要查詢的資料key。

首先我們定義四個變數,分別為left,right,mid,ret。其中left、right和mid作為指向陣列下標的變數,ret儲存查詢的結果(下標)並返回其值。

查詢開始,首先讓left和right指向陣列的兩端,並讓ret為-1(返回-1表示沒有查詢到),求出left和right的中間值mid,比較陣列a[mid]與被查詢元素key的關係。

①若a[mid] = key,則表示找到被查詢元素,查詢結束;

②若a[mid] > key,則表示key應該比a[mid] 小,所以讓right = mid -1,並繼續查詢;

③若a[mid] < key,則表示key應該比a[mid] 大,所以讓left = mid + 1,並繼續查詢;

由此可見,整個查詢的過程一直在繼續,直到找到資料或者查詢完資料,那麼查詢完資料的條件是什麼呢?這裡直接給出答案,有興趣的讀者可以寫一段**除錯檢視或者在紙上演算一下。

right > ltft

由上述條件可以得知,查詢要放在乙個迴圈裡,或者用遞迴實現。下面給出**。

5.二分查詢的**

/*

title: 二分查詢(迴圈實現)

author:pengwill

date:2016-08-29

blog:

*/#include

int main()

;//這裡首先定義了乙個有序的陣列,如果無序,先排序

int left,right,mid,ret,k;

ret = -1;//初始化,-1表示沒有查詢到資料

left = 0;

right = sizeof(a)/sizeof(a[0]);

scanf("%d",&k);//輸入要查詢的資料

while(right>left)else

if(a[mid] > k)else

}printf("%d",ret);

return

0;}

演算法之二分查詢法

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成前 後...

演算法之二分查詢法

所謂的二分查詢法,就是對於乙個有序列表,通過每次取中間值來判斷是否為所要查詢的數值。比如我們聚會時玩的猜數字遊戲,0到100之間猜乙個數值,有兩種方法 一是我們可以乙個乙個的去猜,但是這樣比較耗時,效率低 其次就是二分法,第一次取中間值50,對方會告訴你高了或者低了,若高了,繼續取0到49的中間值2...

演算法鋪子之二分查詢法

本人已經打算將這一系列博文做成動畫趣味科普的形式來呈現,感興趣的話可以點這裡。二分查詢法就是在有序序列中不斷分解三個部分 左 小於待查詢的元素的區域,右 大於待查詢元素的區域,中 中位數 若待查詢的元素與中位數相等,那麼說明已經查詢到想要查詢的元素。否則就看待查詢元素的值比中位數大還是小,如果小,就...