1. 程式人生 > >C語言解決二分搜尋

C語言解決二分搜尋

二分搜尋是運用分治策略的典型例子

分治法的基本思想是將一個 規模為n的問題分解為k個規模較小的子問題,這些子問題問
互相獨立且與原問題相同。遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。

相比於最壞的情況,順序搜尋方法需要O(n)次比較

而二分搜尋在最壞的情況下O(logn)時間內完成搜尋任務

演算法實現

因為陣列本身就是順序的

遞迴實現:

int HalfSearch(int a[],int low,int high,int key)
{
    int mid;
    if(low>high) return -1;//沒找到,遞迴結束
    else{
        mid=(low+high)/2;
        if(a[mid]==key) return mid;//找到了,遞迴結束
        else if(a[mid]<key)  return HalfSearch(a,mid+1,high,key);//右遞迴
        else return HalfSearch(a,low,mid-1,key);//左遞迴
    }
}

非遞迴實現:

int HalfSearch(int a[],int low,int high,int key)
{
    
    int mid;
    while(low<=high)
    {
      mid=(low+high)/2;//二分點
        if(a[mid]==key) return mid;
        else if(a[mid]<key) low=mid+1;
        else high=mid-1;
    }
    return -1;
}

主函式檔案

void main(){
int n=0,m,k;
printf("請輸入陣列長度N:");
scanf_s("%d",&n);
int *p = new int[n];
//do something
delete []p;
printf("按升序輸入");
for(int i=0;i<n;i++)
{
    printf("輸入a[%d]",i);
    scanf_s("%d",&*(p+i));
}

printf("請輸入要查詢的數M:");
scanf_s("%d",&k);
m=HalfSearch(p,0,n-1,k);
if(m!=-1)
printf("a[%d]:%d",m,k);
else
    printf("沒有結果");

}