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("没有结果");

}

猜你喜欢

转载自blog.csdn.net/eternitybubble/article/details/81077629