數據結構之--折半查找
定義:折半查找技術,也就是二分查找。它的前提是線性表中的記錄必須是關鍵碼有序(通常從大到小有序),線性表必須采用順序存儲。折半查找的基本思想是:取中間記錄作為比較對象,若給定值與中間記錄的關鍵字,則在中間記錄的關鍵字相等,則查找成功;若給定值小於中間記錄的作伴去繼續查找;若給定值大於中間記錄的關鍵字,則在中間記錄的右半區繼續查找。不斷重復上述過程,直到查找成功,或所有查找區域無記錄,查找失敗為止。
圖解:
時間復雜度:由於具有n個節點的完全二叉樹的深度為⌊log₂n⌋+1,盡管折半查找判定二叉樹並不是完全二叉樹,但同樣相同的推導可以得出,最壞的情況查找到關鍵字或者查找失敗的次數為⌊log₂n⌋+1。因此我們折半算法的時間復雜度為:O(logn),它顯然遠遠好於順序查找的O(n)的時間復雜度了。
#include<stdio.h>
int Binary_Search(int *a,int n,int key){
int low,mid,high;
low = 1; /*定義最低下表為記錄首位*/
high = n; /*定義最高下表為記錄末位*/
while(low<=high){
mid=(low+high)/2; /*折半*/
if(key<a[mid]) /*若查找值比中值小*/
high=mid-1; /*最高下標調整到中位下標小一位*/
else if(key>a[mid]) /*若查找值比中值大*/
low=mid+1; /*最低下標調整到中值位下標大一位*/
else
return mid; /*若相等說明mid即為查找到的位置*/
}
return 0;
}
void main(){
int num[] = {0,1,16,24,35,47,59,62,73,88,99};
int result = Binary_Search(num,sizeof(num)/sizeof(num[0])-1,62);
printf("查找結果為:%d\n",result);
}
運行結果為: