算法第二章上机实验报告
1、实践题目:7-1 二分查找
2、问题描述:输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
3、算法描述:在给定元素排好顺序的前提下,用left表示最左边的数,以及用right表示最右边的数,用mid表示中间的数,如果最中间的数等于要找的数便直接输出下标;如果要找的数小于最中间的数,则mid=right;若要找的数大于最中间的数,则mid=left;不断的去进行这个循环最终可以得出所要找的x,从而输出它的下标。关于比较次数,则在二分查找的函数之前定义一个全局变量sum=0,且在循环里每进行一次便进行一次次数的累计。
4、源代码
#include "stdafx.h" #include"iostream" using namespace std; int sum=0; int binarySerach(int array[],const int&x, int n) { int left = 0; int right = n - 1; while (left <= right) { sum++; int mid = (left + right) / 2; if (array[mid] == x) { return mid; } else if (array[mid] < x) { left = mid + 1; } else { right = mid - 1; } } return -1; } int _tmain(int argc, _TCHAR* argv[]) { int a[200];int n,i,y,k; cin>>n; for(i=0;i<n;i++) cin>>a[i]; cin>>k; y=binarySerach(a,k,n); cout<<y<<endl; cout<<sum<<endl; system("pause"); return 0; }
5、算法时间与空间复杂度:每进行一次while循环,待搜索数组大小减小一半,因此在最坏的情况下,while循环被执行了O(logn)次,所以算法在最坏情况下计算的时间复杂性为O(logn).
6、心得体会:关于全局变量跟局部变量使用方法有些模糊,关于c++的某些知识已经遗忘,课后应该抓紧时间复习一下以前的知识。