折半查詢
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.基本思路 在有序表中,取中間元素作為比較物件,若給定值與中間元素的要查詢的數相等,則查詢成功 若給定值小於中間元素的要查詢的數,則在中間元素的左半區繼續查詢 若給定值大於中間元素的要查詢的數,則在中間元素的右半區繼續查詢。不斷...