- 实践题目:7-1
- 问题描述:使用二分查找算法在n个非降序排列的整数中查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
- 算法描述:将n个元素分成个数大致相同的两半,取a[mid]与x比较。如果x=a[mid],则找到x,算法终止;如果x<a[mid],则只在数组a的左半部继续查找x,如果x>a[mid],则只在a的右半部继续搜索x。同时,在while语句里加一个b统计比较次数。
- 代码实现:
#include<iostream> using namespace std; int BinarySearch(int a[],int left,int right,int x,int &b){ while (left<=right){ b++; int middle =(left+right)/2; if (x==a[middle]){ return middle; } if(x>a[middle]){ left=middle+1; } else { right =middle-1; } } return -1; } int main(){ int n,x,b=0; cin>>n; int a[1000]; for (int i=0;i<n;i++){ cin>>a[i]; } cin>>x; int index=BinarySearch(a,0,n-1,x,b); cout<<index<<endl<<b; }
5.时间复杂度和空间复杂度:用了二分法搜索算法,寻找x的时间复杂度为O(logn);空间复杂度为数组空间大小,是一个常数,与变量n的取值无关。所以空间复杂度为O(1)
6.心得体会
这道题目其实在掌握了书上的二分搜索算法后就变得很简单