您的位置:首页 > 其它

分治策略之二分搜索技术

2012-06-02 12:30 204 查看
问题描述:

给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。

算法复杂度分析:

每执行一次算法的while循环,待搜索数组的大小减少一半。因此,在最坏情况下,while循环被执行了O(logn)
次。循环体内运算需要O(1)
时间,因此整个算法在最坏情况下的计算时间复杂性为O(logn)


//二分搜索技术(分治)
#include <iostream>

using namespace std;

template <typename Type>
int BinarySearch(Type a[], const Type &x, int n)
{
//在a[0]<=a[1]<=...<=a[n-1]中搜索x
//找到x时返回其在数组中的位置,否则返回-1
int left = 0;
int right = n-1;
while(left <= right)
{
int middle = (left+right)/2;
if(x == a[middle])
{
return middle;
}
if(x > a[middle])
{
left = middle+1;
} else {
right = middle-1;
}
}
//未找到x
return -1;
}

int main()
{
int n;
cout<<"输入数组的大小n:"<<endl;
cin>>n;
int *a = new int
;
cout<<"输入数组中的数据:"<<endl;
for(int i = 0; i < n; i++)
{
cin>>a[i];
}
int obj_num;
cout<<"输入所要找的数:"<<endl;
cin>>obj_num;
int flag = BinarySearch(a,obj_num,n);

if(-1 == flag)
{
cout<<"未找到obj_num"<<endl;
} else {
cout<<"找到obj_num,其在数组中的下标为:"<<flag<<endl<<"是第"<<flag+1<<"个数"<<endl;
}
delete a;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: