您的位置:首页 > 其它

二分查找的递归和非递归实现

2012-09-01 23:28 309 查看
/*
author:justinzhang
email:uestczhangchao@gmail.com
time:2012-8-3018:54:01
desc:binarysearchfromtheaocpp380
*/
#include<iostream>
#include<vector>
#include<memory>//forauto_ptr,butauto_ptrdoesnotsupportarrays
#include<ctime>//fortime(0)function
#include<cstdlib>//forsrandandrandfunction
#include<algorithm>//forsortandbinary_searchfunction
usingnamespacestd;
template<classtype>
typerandom(typestart,typeend)
{
srand((int)time(0)*rand());
return(start+(end-start)*rand()/(RAND_MAX+1.0));
}
template<classtype>boolmy_binary_search(vector<type>data,intbegin,intend,typevalue)
{
intL=begin;
intU=end;
while(U>L)//注意此处不要写成了U>=L,如果是>=,并且数组下标从0开始的话,就会导致vector下标越界
{
intM=L+(U-L)/2;
if(data[M]>value)
U=M-1;
elseif(data[M]<value)
L=M+1;
else
returntrue;
}
returnfalse;
}
template<classtype>boolrecursive_binary_search(vector<type>data,intbegin,intend,typekey)
{
if(begin>=end)
returnfalse;
else
{
intmid=begin+(end-begin)/2;
if(data[mid]>key)
recursive_binary_search(data,begin,mid-1,key);
elseif(data[mid]<key)
recursive_binary_search(data,mid+1,end,key);
else
returntrue;
}
}
intmain()
{
/*auto_ptrdoesnotsupportforarrays,C11support*/
//auto_ptr<double>auto_ptr_data(newdouble);
//*auto_ptr_data=100;
//cout<<*auto_ptr_data<<endl;
vector<double>data;
for(unsignedinti=0;i<20;i++)
{
data.push_back(random<double>(1,10));
}
data.push_back(77.77);
vector<double>copy_data(data.size());
copy(data.begin(),data.end(),copy_data.begin());
for(unsignedinti=0;i<10;i++)
{
cout<<data[i]<<"=="<<copy_data[i]<<endl;
}
sort(data.begin(),data.end());
for(unsignedinti=0;i<data.size();i++)
if(binary_search(data.begin(),data.end(),copy_data[i]))
{
cout<<"founditem:"<<copy_data[i]<<endl;
}
/*-----testnon-recursiveversion-----*/
if(my_binary_search<double>(data,0,data.size(),898))
{
cout<<"finditem:"<<898<<endl;
}
else
cout<<"notfounditem:"<<898<<endl;
/*----testrecursivebinarysearch-----*/
vector<double>A(10,random(1,10));//初始化向量A,每一个元素都为1
for(inti=0;i<10;i++)
cout<<A[i]<<endl;
if(recursive_binary_search<double>(A,1,5,1))
cout<<"found!"<<endl;
return0;
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: