问题描述
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。
思路
将n个元素分成个数大致相同的两半取a[n/2]与x进行比较:
如果x=a[n/2],则找到,算法终止;
如果x<a[n/2],则只要在数组a的左半部搜索x;
如果x>a[n/2],则只要在数组a的右半部继续搜索x.
时间复杂度
递归表达式
T(n)={1T(n2)+1n=1n>1
解递归表达式过程
T(n)=T(n2)+1=T(n22)+2=T(n23)+3...=T(n2m)+m
当2m=n即m=log2n时,T(n2m)=T(1)终止分解。
=T(1)+m=log2n+1
则该算法的时间复杂度为 o(logn)
代码
#include <iostream>
using namespace std;
int BinarySearch(int Array[],int low,int high,int key/*要找的值*/)
{
if (low<=high)
{
int mid = (low+high)/2;
if(key == Array[mid])
return mid+1;
else if(key<Array[mid])
return BinarySearch(Array,low,mid-1,key);
else if(key>Array[mid])
return BinarySearch(Array,mid+1,high,key);
}
else
return -1;
}
int main(){
int a[] = {2,5,7,12,14,15,17,21,24,26,32,35,56,66,76,78};
cout<<"为该数组第"<<BinarySearch(a,0,16,24)<<"个元素"<<endl;
return 1;
}