**
二分查找
**
-
基本思路:
采取减治的方法,对比中间位置数据与关键字,相等则返回此位置,小于则递归搜索左半部分,否则搜索右半部分,如果搜索集合只剩下一个元素且不是关键字,则没有找到。 -
算法
BINARYSEARCH(array, i, j, key):
if (i==j && array[i] ≠ key)
return -1
mid = (i+j)/2
if(array[mid]==key)
return mid
else if(array[mid]<key)
return BINARYSEARCH(array, mid+1, j, key)
else
return BINARYSEARCH(array, i, mid-1, key)
-
复杂度:O(logn)
-
运行截图
-
源代码
说明:使用了递归和迭代两种方法
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
//调用BinarySearch,用于打印结果
void BiSearch(const vector<int> &list, int key);
//二分查找主函数,递归法
int BinarySearchR(const vector<int> &list, int key, int begin, int end);
//二分查找主函数,迭代法
int BinarySearch(const vector<int> &list, int key, int begin, int end);
//给数组分配大小并赋值
void GetList(vector<int> &list, int n);
//得到一个随机数
int GetKey(int n);
//打印数组
void Print(vector<int> list);
int main(int argc, char** argv) {
vector<int> list;
srand((int)time(NULL));
GetList(list,20);
Print(list);
for(int i=0;i<5;i++)
{
BiSearch(list,GetKey(list.size()));
}
return 0;
}
void GetList(vector<int> &list, int n)
{
list.resize(n);
for(int i=0;i<n;i++)
{
list[i] = i;
}
}
int BinarySearchR(const vector<int> &list, int key, int begin, int end)
{
if(begin==end && list[begin]!=key)
return -1;
int mid = (begin+end)/2;
if(list[mid]==key)
return mid;
else if(list[mid]>key)
return BinarySearchR(list,key,begin,mid-1);
else
return BinarySearchR(list,key,mid+1,end);
}
int GetKey(int n)
{
return (int)(-0.1*n+rand()%(int)(n*1.2));
}
void Print(vector<int> list)
{
for(int i=0;i<list.size();i++)
{
cout<<list[i]<<" ";
}
cout<<endl;
}
void BiSearch(const vector<int> &list, int key)
{
int result1 = BinarySearch(list,key,0,list.size()-1);
int result2 = BinarySearchR(list,key,0,list.size()-1);
cout<<"迭代法"<<endl;
cout<<"关键字:"<<key<<" ";
if(result1==-1)
cout<<"没有找到 "<<endl;
else
cout<<"位置:"<<result1<<endl;
cout<<"递归法"<<endl;
cout<<"关键字:"<<key<<" ";
if(result2==-1)
cout<<"没有找到 "<<endl;
else
cout<<"位置:"<<result2<<endl;
}
int BinarySearch(const vector<int> &list, int key, int begin, int end)
{
while(begin<=end)
{
int mid = (begin+end)/2;
if(list[mid]==key)
return mid;
else if(list[mid]<key)
begin=mid+1;
else
end=mid-1;
}
return -1;
}