折半查找法

         查找是在程序設計中最常用到的算法之一,假定要從n個整數中查找x的值是否存在,最原始的辦法是從頭到尾逐個查找,這種查找的方法稱爲順序查找。這種方法效率低。假如要從1000個數據中要查找某一個所需的數據,而該數據恰恰是最後一個,則需要取數據和比較數據1000次。對n個數據的平均取數和比較的次數爲n/2次。 折半查找的速度有所改進,但是隻適用於巳排好序的數列。其基本思路是:先檢索中間的一個數據,看它是否爲所需的數據,如果不是,則p判斷要找的數據是在中間數的哪一邊,下次就在這個範圍內查找。

折半查找的算法如下:
          首先需要設三個指示器top,bot,mid 分別指向數列的開頭,中間和末尾,假定有15個元素,開始時令top=0, bot=14,mid=(top+bot)/2=7。接着進行以下判斷:


(1) 如果x=[mid]則設查到標誌爲“真”,打印有關信息。


(2) 否則如果x<a[mid] 則下一步查找範圍應該在a[top]到a[mid-1]之間,改變bot使之等於mid-1,即top=mid-1。(3) 如果x>a[mid]則下一步查找範圍應該在a[mid+1]到a[bot]之間,改變top使之等於mid+1,即top=mid+1。


重複以上過程直到bot 程序如下:


#define N 15
main()
{
void bi_search(int a[],int n,int x);
int a[100],x,i,n=15;
printf("input the numbers:/n");
for(i=0;i scanf("%d",&a[i]);
printf("input x:/n");
scanf("%d",&x);
bi_search(a,n,x);
}

void bi_search(int a[],int n,int x)
{
int mid,top,bot,i,find;
top=0;
bot=n-1;
find=0;
do
{
mid=(top+bot)/2;
if(x==a[mid])
{
printf("find:%3d,it is a[%d]",x,mid);
printf("/n");
find=1;
}
else

if(x else if(x>a[mid]) top=mid+1;
} while((top<=bot) && (find==0));
if(find==0)
printf("%3d not been found.",x);
printf("/n");
}




      海譯翻譯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章