算法实践实践报告

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,问题很快就解决了。两个人一起讨论比一个人空想做起来会更快。

 

posted @ 2018-10-18 19:22  liujieyu  阅读(483)  评论(0编辑  收藏  举报