程序介紹
折半查找法是效率較高的一種查找方法。假設有已經按照從小到大的順序排列好的五個整數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;
}