二分搜索是运用分治策略的典型例子
分治法的基本思想是将一个 规模为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("没有结果");
}