1.实践题目
7-1 二分查找 (20 分)
输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
输入格式:
输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。
输出格式:
输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
输入样例:
4
1 2 3 4
1
输出样例:
0
2
2.问题描述
输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
1、对输入的数组
2、二分法
3.查找成功,输出其所在位置,以及比较次数
4、失败,输出-1及比较次数
3.算法描述
1 #include<iostream> 2 using namespace std; 3 extern int sum=0; 4 5 int BinarySearch(int a[],const int &x,int n) 6 { 7 int left = 0; 8 int right = n-1; 9 while (left <= right) 10 { 11 sum++; 12 int middle = (left + right)/2; 13 if(x == a[middle]) return middle; 14 if(x > a[middle]) left = middle + 1; 15 else right = middle - 1; 16 } 17 return -1; 18 } 19 20 int main() 21 { 22 int n,a[1000],x,result; 23 cin>>n; 24 for(int i=0;i<n;i++) 25 cin>>a[i]; 26 cin>>x; 27 28 result = BinarySearch(a,x,n); 29 cout<<result<<endl<<sum; 30 return 0; 31 32 }
4.算法时间及空间复杂度分析
1、时间复杂度:1)、本题使用的是二分查找算法,
2)、while循环一次,待查找数组的长度减小至前一次的一半
3)、时间复杂度为T(n) = O(logn)
2、空间复杂度:1)、辅助空间是常数级别的,
2)、空间复杂度为O(1)
5.心得体会
能理解二分法的使用,同时在三道题的巩固下,对二分法有加深了印象,同时和同学一同完成,还能互相提示,而且,还能够互相讲思路,同时能够指出对方的不足,以及自己的某些细节方面的缺漏,最后对于老师的提问还是有些害怕,就是对同学能够清晰的讲出来,但是面对老师不敢,这真的是一件很神奇的事情,下次加油。