查詢 折半查詢

2021-09-10 07:13:46 字數 1671 閱讀 6373

折半查詢

int search(keytype key,int n,keytype k)

return -1;//查詢失敗,返回-1

}

在演算法中,n表示記錄的個數。key表示要查詢的關鍵字key為關鍵字順序表,每個元素都是對應記錄的關鍵字。例如key[0]為第0個記錄的關鍵字。如果每條記錄的資訊與它的關鍵字都存放在乙個記錄裡,如下定義:

typedef struct

recordtype;

每個記錄中包含乙個關鍵字key和乙個資料域data。這種記錄的折半查詢法可描述為:

int search(recordtype r,int n,keytype k)

return -1; //查詢失敗,返回-1

}

這裡要注意,以上演算法只適用於關鍵字順序遞增的有序表查詢。如果該順序表是關鍵字遞減的,則演算法需要改動,在low指標與high指標的修改上對調即可。

折半查詢法的優點:折半查詢法的效率比順序查詢法的效率要高很多。如果乙個順序表中有1000個關鍵字,應用順序查詢法查詢指定的關鍵字,平均要比較500次。而應用折半查詢法,平均只用比較9次。因此對於順序檔案記錄的查詢,應當使用折半查詢法。

折半查詢法的缺點:只能應用於關鍵字有序的順序表的查詢,且一般不適用於對鍊錶中記錄的查詢。

折半查詢法的優化:在使用折半查詢前,將關鍵字key與上下界low與high先進行比較,若與其中乙個相匹配可直接跳出,無需繼續折半。

【例項】

有乙個陣列a[10],裡面存放了10個整數,順序遞增。任意輸入乙個數字n,找到n在陣列中的位置。如果n不屬於該陣列a,顯示錯誤提示。

a[10]=

【分析】

#includeint search(int a,int n,int key)

} return -1; //查詢失敗,返回-1

}main()

,i,n,addr;

printf("a[10]:");

for(i=0;i<10;i++)

printf("%d ",a[i]); //顯示陣列a的內容

printf("\n輸入要查詢元素:");

scanf("%d",&n); //輸入待查詢元素

addr=search(a,10,n); //折半查詢返回該元素在陣列中的下標

if(addr!=-1) //查詢成功

printf("%d是陣列中的第%d個元素",n,addr+1);

else //查詢失敗

printf("a陣列中無%d",n);

return 0;

}

執行結果如圖所示:

注意:陣列的下標從0開始,故要在原返回值上+1,才為元素的位置。

查詢之折半查詢

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

查詢之折半查詢

折半查詢又稱二分查詢,適用有序的順序表。附 筆試考察查詢,這個是經典查詢法 基本思路 首先給定值key與表中中間位置元素的關鍵字,若相等則查詢成功,返回位置。若不等,則所需查詢的元素只能在中間元素外的前半部分或後半部分中。縮小範圍,遞迴查詢。2.折半查詢的 int binary search seq...

查詢演算法 折半查詢

本小節知識點 1.掌握 基本思路 2.掌握 實現步驟 3.了解 練習 1.基本思路 在有序表中,取中間元素作為比較物件,若給定值與中間元素的要查詢的數相等,則查詢成功 若給定值小於中間元素的要查詢的數,則在中間元素的左半區繼續查詢 若給定值大於中間元素的要查詢的數,則在中間元素的右半區繼續查詢。不斷...