首先把有n个元素的排好序的数组a分成两半,每次把第n/2个与要搜索的数x进行比较,如果相等,则比较成功。如果a[n/2]<x,则继续搜索数组的左半部分,如果a[n/2]>x,则搜索数组的右半部分,重复循环记录次数直到比较成功。如果在数组中找不到x元素,则返回-1.
int BinarySearch(int a[],int x,int n)
{
int l=0,r=n-1;
while(l<=r)
{
int m=(l+r)/2;
if(x==a[m]) cout<<m<<endl;
if(x>a[m]) l=m+1;//继续在左半部分查找
else r= m-1;//继续在右半部分查找
p++;//p为比较次数
if(x!=a[m]&&l>r) cout<<-1<<endl;//找不到时返回-1
}
时间复杂度:每执行一次循环,数组长度减小一半,其中把数组分成一半的时间复杂度为O(1)
T(n) = O(1) + T(n/2)
T(n) = O(1) + logn
O(n) = logn
空间复杂度:O(1),辅助空间是常数级别的
(2)还体会到了对程序的实践过程要有清晰的理解,如在题目中要考虑对比较次数的统计,如何快速分析以便做到减少语句的执行次数且结果准确,就需要对各种情况的输入程序执行的语句有清楚的认识。
原文:https://www.cnblogs.com/alqq/p/11570614.html