查詢演算法2 折半查詢

2021-10-01 07:14:23 字數 1439 閱讀 2202

從小到大排列的有序序列。折半查詢的演算法描述如下:

將待查詢元素與表中間的元素進行比較,如果兩者相等,則說明查詢成功;否則利用中間位置將表分成兩部分,如果待查詢元素小於中間位置的元素值,則繼續與前乙個子表的中間位置元素記性比較;否則與後乙個子表的中間位置元素進行比較。不斷重複上述操作,直到找到與待查詢元素相等的元素,表明查詢成功。如果子表為空表,表明查詢失敗。

【示例】

乙個有序順序表為7,15,22,29,41,55,67,78,81,99,如果要查詢的元素為67。利用折半查詢演算法思想,過程如下。

其中low,high,表示兩個指標,分別指向待查詢元素的下界和上界,指標mid指向low和high的中間位置,即mid=(low+high)/2。

初始時,low=0,high=9,mig=(0+9)/2=4,因為list[mid]x,所以需要在左半區繼續查詢x。此時有low=5,high=6,mid=5,因為list[mid]#include#define maxsize 100

using namespace std;

typedef struct

table;

int binarysearch(table s, int x);

void main()

,8 };

int i, find, x;

printf("有序順序表中的元素:\n");

for (i = 0; ix) /*如果mid所指示的元素大於x,則修改high指標*/

high = mid - 1;

} return 0;

}結果:

【特點】

*折半查詢演算法要求待排序的元素必須是乙個有序的序列。

*折半搜尋查詢的演算法效率優於順序查詢演算法的效率。

【效率分析】

折半查詢演算法過程可以用乙個判定樹去描述。例如用折半查詢值為56的元素時,需要比較4次。從圖中可以看出查詢值為41的元素時,需要比較1次。查詢值為78的元素時,需要比較2次。查詢值為55的元素時,需要比較3次。查詢值為67的元素時,需要比較4次。整個查詢過程可以用二叉判定樹來表示。

其中結點旁邊的序號為該元素在序列中的下標。從圖中的判定樹不難看出,查詢元素67的過程正好是從根結點到元素值為67的結點路徑。查詢元素67的比較次數正好是該元素在判定樹種所在層次。因此,如果表中有n個元素,折半查詢成功時,最多需要比較的次數為

對於具有n個結點的有序表(恰好構成乙個深度為h的滿二叉樹)來說,有

查詢失敗時,有序表的折半查詢失敗平均查詢長度為

24,折半查詢

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

6 2 2 折半查詢

折半查詢,又稱二分查詢,它適用於有序的順序表。基本思路是 首先將給定值key與表中中間位置元素的關鍵字比較,若相等,則查詢成功,返回該元素的儲存位置 若不等,則所需查詢的元素只能在中間元素以外的前半部分或後半部分中 例如,在查詢表公升序排列時,若給定值key大於中間元素的關鍵字,則所查詢的元素只可能...

6 13 折半查詢

給乙個嚴格遞增數列,函式int search bin sstable t,keytype k 用來二分地查詢k在數列中的位置。函式介面定義 int search bin sstable t,keytype k 其中t是有序表,k是查詢的值。裁判測試程式樣例 include using namespa...