1.实践题目 :
二分查找
2.问题描述 :
用二分查找法查找x,并输出x所在下标及比较次数,若x不存在则输出与-1比较的次数。
3.算法描述 :
int BinarySearch(int a[], int left, int right,int x,int &count){ //用递归的方法,定义引用count计算比较次数 count++; //每进入递归函数一次则比较次数+1 if(left == right){ if(x == a[left]) return left; else return -1; } while(left < right){ int mid = (left + right) / 2; if(x == a[mid]) { return mid; } if(x < a[mid]) return BinarySearch(a, left, mid-1, x, count); if(x > a[mid]) return BinarySearch(a, mid+1, right, x, count); } }
// 在主函数里输入数组及所查找的数字,递归后返回下标及比较次数
4.算法时间及空间复杂度分析 :
时间复杂度分析:二分搜索的时间复杂度为O(log2n),输入数组的时间复杂度为O(n),而O(log2n) < O(n),所以T(n) = O(log2n) + O(n) = O(n),即时间复杂度为O(n)。
空间复杂度分析:查找时反复调用BinarySearch,递归n次,就需要n个空间,这部分的空间复杂度为S(n),而主函数中的其他方法比较简单,空间复杂度为S(1),所以该算法的空间复杂度为S(n)。
5.心得体会 :
一开始没有想到用引用,对于如何计算比较次数这一点讨论了很多次,尝试在递归的过程中加上count++,都没有成功,不是这里报错就是那里不对,后来小组的同学想到了引用count,问题很快就解决了。两个人一起讨论比一个人空想做起来会更快。