您的位置:首页 > 其它

二分查找总结

2015-03-12 16:59 295 查看
二分查找
1.二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(log(n))

2.二分查找的一个条件是待查询的数组是有序的。

3.二分查找的主要思路是:

n个对象从小到大存放在有序顺序表ST中,k为给定值。

设low、high指向待查元素所在区间的下界、上界,即low=1,high=n

设mid指向待查区间的中点,即mid=(low+high)/2û让k与mid指向的记录比较

若k=ST[mid].key,查找成功,结束

若k<ST[mid].key,则high=mid-1 [上半区间]

若k>ST[mid].key,则low=mid+1 [下半区间]

重复3,4操作,直至low>high时,查找失败。

二分查找有两种实现方式:递归和非递归
第一种非递归
#include<iostream>

using namespace std;

int Binary(int *r,int len,int key)

{

int l,h,mid;

l=1;

h=len;

while(l<=h)

{

mid=(l+h)/2;

if(r[mid]==key)

return mid;

else if(r[mid]<key)

l=mid+1;

else

h=mid-1;

}

return -1;

}

int main()

{

freopen("cin.txt","r",stdin);

int r[100];

int len,i,key;

cin>>len;

for(i=1;i<=len;i++)

cin>>r[i];

cin>>key;

cout<<Binary(r,len,key)<<endl;

return 0;

}

第二种递归
#include<iostream>

using namespace std;

int Binary(int array[],int &value,int &start,int &end)

{

if(start>end)

return -1;

int mid=(start+end)/2;

if(array[mid]==value)

return mid;

else if(value<array[mid])

{

end=mid-1;

return Binary(array,value,start,end);

}

else

{

start=mid+1;

return Binary(array,value,start,end);

}

}

int BinarySearch(int array[],int &len,int &value)

{

//如果传入的数组为空或者数组长度小于等于0则直接返回-1

if(array==NULL||len<=0)

return 0;

int start,end;

start=0;

end=len-1;

return Binary(array,value,start,end);

}

int main()

{

freopen("cin.txt","r",stdin);

int array[100];

int i,len;

cin>>len;

for(i=0;i<len;i++)

cin>>array[i];

int key;

cin>>key;

cout<<BinarySearch(array,len,key)<<endl;

return 0;

}
附注:在效率方面,传值调用要比传址调用来的低,因为传值调用要进行一次变量的拷贝,而传址调用则是直接对这个变量进行操作


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: