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("沒有結果");
}