二分查找总结
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;
}
附注:在效率方面,传值调用要比传址调用来的低,因为传值调用要进行一次变量的拷贝,而传址调用则是直接对这个变量进行操作
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;
}
附注:在效率方面,传值调用要比传址调用来的低,因为传值调用要进行一次变量的拷贝,而传址调用则是直接对这个变量进行操作
相关文章推荐
- 二分查找递归与非递归总结
- 查找(二):二分查找----<学习总结>
- [LeetCode] Serch Insert Position (总结二分查找) Java version
- 二分查找及其变形总结
- binarySearch二分查找总结
- 二分查找总结
- 不光是查找值!"二分搜索"总结
- 对排序的总结&&二分查找
- [leetcode]二分查找总结
- 二分查找总结
- 【二分查找】学习总结
- 二分查找总结
- 二分查找总结
- 二分查找总结
- java中二分查找的总结
- 查找算法总结之顺序查找、二分查找、静态树查找
- 二分查找小小总结
- 二分查找分类总结
- 查找一,基于ST的顺序与二分 总结关键字
- 由九度1502引出的对二分查找的一点总结v1.0