1、实践题目:7-1
2、问题描述:使用二分查找算法在n个非降序排列的整数中查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
3、算法描述:将n个元素分成个数大致相同的两半,取a[mid]与x比较。如果x=a[mid],则找到x,算法终止;如果x<a[mid],则只在数组a的左半部继续查找x,如果x>a[mid],则只在a的右半部继续搜索x。同时,在while语句里加一个b统计比较次数。
4、代码如下:
1 #include<iostream> 2 using namespace std; 3 int BinarySearch(int a[],int left,int right,int x,int &b){ 4 while (left<=right){ 5 b++; 6 int middle =(left+right)/2; 7 if (x==a[middle]){ 8 return middle; 9 } 10 if(x>a[middle]){ 11 left=middle+1; 12 } 13 else { 14 right =middle-1; 15 } 16 } 17 return -1; 18 } 19 int main(){ 20 int n,x,b=0; 21 cin>>n; 22 int a[1000]; 23 for (int i=0;i<n;i++){ 24 cin>>a[i]; 25 } 26 cin>>x; 27 int index=BinarySearch(a,0,n-1,x,b); 28 cout<<index<<endl<<b; 29 }
5、时间复杂度和空间复杂度:用了二分法搜索算法,寻找x的时间复杂度为O(logn);空间复杂度为数组空间大小,是一个常数,与变量n的取值无关。所以空间复杂度为O(1)。
6、心得体会:要灵活地运用学过的代码,将它们灵活地嵌入要解决的问题中。在解决问题时,要多考虑到最优解,也就是时间复杂度最小的解法,这有利于使算法更便捷,资源更能合理的运用。