您的位置:首页 > 编程语言 > C语言/C++

二分查找/二分搜索(binary_search)详解

2013-01-21 14:27 459 查看
前提:

1.不考虑超大数据情况。

2.对于二分查找/搜索,要求待查表为有序表。

 

代码:

  1.递归方式: 

#include<iostream>
using namespace std;
int binary_search(int a[],int h,int t,int value);
int main()
{
int a[11]={0,1,2,3,4,5,6,7,8,9,10};
int len=sizeof(a)/sizeof(a[0]);
int result = binary_search(a,0,len-1,10);
cout<<result<<endl;
}
int binary_search(int a[],int h,int t,int value)
{
if(h>t)
{

return -1;
}

int mid=(h+t)/2;

if(value<a[mid]){
binary_search(a,h,mid-1,value);
}else if(value>a[mid]){
binary_search(a,mid+1,t,value);
}else{

return mid;
}

}

 

  2.非递归方式:

 

#include<iostream>
using namespace std;
int search_binary(int a[],int low,int high,int value);
int main()
{
int a[11]={0,1,2,3,4,5,6,7,8,9,10};
int len=sizeof(a)/sizeof(a[0]);
int result=search_binary(a,0,len-1,2);
cout<<result<<endl;
}

int search_binary(int a[],int low,int high,int value)
{
int middle=0;

while(low<high)
{
middle=(low+high)/2;

if(value>a[middle])
{
low=middle+1;
}else if(value<a[middle]){
high=middle-1;
}else{

return middle;
}
}

return -1;
}


 

 

算法分析:

1.时间复杂度:

       从二分查找的过程来看,每次比较目标值和当前序列中间元素的值后,都会将当前序列一分为二,继续在分好的序列中查找。序列的变化其实就是一个二叉树的结构。在每一层上面,执行的比较操作都相同,消费时间设为C。 对于一个二叉树,深度为lgn+1。所以时间总量为:T(n)=Clgn+C。

       时间复杂度为:O(lgn)

2.用法解析:

       优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

       

 

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