折半查找法

折半查找法

搜索算法
在計算機科學中,折半搜索(英語:half-interval search),也稱二分搜索(英語:binary search)、對數搜索(英語:logarithmic search),是一種在有序數組中查找某一特定元素的搜索算法。[1]搜索過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結束;如果某一特定元素大于或者小于中間元素,則在數組大于或小于中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數組為空,則代表找不到。這種搜索算法每一次比較都使搜索範圍縮小一半。[2]
  • 中文名:折半查找法
  • 外文名:half-interval search
  • 别名:
  • 屬于:效率較高的一種查找方法

程序介紹

折半查找法是效率較高的一種查找方法。假設有已經按照從小到大的順序排列好的五個整數a0~a4,要查找的數是X,其基本思想是: 設查找數據的範圍下限為l=0,上限為h=4,求中點m=(l+h)/2,用X與中點元素am比較,若X等于am,即找到,停止查找;否則,若X大于am,替換下限l=m+1,到下半段繼續查找;若X小于am,換上限h=m-1,到上半段繼續查找;如此重複前面的過程直到找到或者l>h為止。如果l>h,說明沒有此數,打印找不到信息,程序結束。該方法是查找的範圍不斷縮小一半,所以查找效率較高。

優缺點

Bentley在他的著作《Writing Correct Programs》中寫道,90%的計算機專家不能在2小時内寫出完全正确的二分搜索算法。問題的關鍵在于準确地制定各次查找範圍的邊界以及終止條件的确定,正确地歸納奇偶數的各種情況,其實整理後可以發現它的具體算法是很直觀的。

折半查找法的優點是比較次數少,查找速度快,平均性能好;

其缺點是要求待查表為有序表,且插入删除困難。

因此,折半查找方法适用于不經常變動而查找頻繁的有序列表。

算法步驟描述

① 首先确定整個查找區間的中間位置 mid = (left + right)/2 。

② 用待查關鍵字值與中間位置的關鍵字值進行比較;若相等,則查找成功;若大于,則在後(右)半個區域繼續進行折半查找;若小于,則在前(左)半個區域繼續進行折半查找。

③ 對确定的縮小區域再按折半公式,重複上述步驟。最後,得到結果:要麼查找成功, 要麼查找失敗。折半查找的存儲結構采用一維數組存放。

基本算法實現

函數

bin_search(int A,int n,int key){

int low,high,mid;

low = 0;

high = n-1;

while(low<=high)

{

mid =(low + high)/2;

if(A[mid]==key)return mid+1;

if(A[mid]

low =mid + 1;

}

if(A[mid]>key){

high= mid - 1;

}

}

return -1;

}

C語言實現代碼

#include int main()

{

int a={0,1,2,3,4,5,6,7,8,9,10},min=0,max=10,mid,n; //max為數列長度,a作為第一個數組元素

printf("請輸入您要查找的數:n");

scanf("%d",&n);

while(min+1!=max)

{

mid=(min+max)/2;

if (n>a[mid]) min=mid;

else if (n

else

{

printf("輸入的數在數列的第%d位n",mid);

exit(0);

}

}

if(n==a[max])

{

max+=1;

printf("n輸入的數在數列的第%d位n",max);

}

else if(n==a[min])

{

min+=1;

printf("n輸入的數在數列的第%d位n",min);

}

else if(n!=a[mid])

printf("n輸入的數不在數列中");

}

Dev-c++實現

#include

#include

void main()

{

int a={1,2,3,4,5,6,7,8,9,10,11,12,13,15};

int n,m,top,bot,mid;

top=m=1; //此處修改top=0;m=1;

bot=14;

printf("please input a number:");

scanf("%d",&n);

while(top<=bot)

{

mid=(top+bot)/2;

if(n==a[mid])

{

printf("這是第%d個元素的值。n",mid+1);

m=0;

break;

}

else if(n>a[mid])

top=mid+1;

else if(n

bot=mid-1;

}

if(m)

printf("無此數。n");

system("PAUSE");

return 0;

}

上一篇:台風白鹿

下一篇:台風尼伯特

相關詞條

相關搜索

其它詞條