1.7-1 二分查找

2.问题描述:

  输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

3.算法描述:

  此题为基本的二分查找法并加上比较次数的输出。故在只需要在原来二分搜索的算法的基础上,设置一个全局变量num记录比较次数,在每一条比较的语句后,使num++。

4.算法时间及空间复杂度分析(要有分析过程)

  时间复杂度:二分搜索法充分利用了元素间的次序关系,采用分治策略,可在最坏情况下用O(logn)时间完成搜索任务。每执行一次while循环,待搜索数组的大小就减小一半。因此在最坏情况下,while循环被执行了O(logn)次。循环体内外运算需要O(1)的时间。因此整个算法在最坏情况下的时间复杂度为O(logn)。

  空间复杂度:二分搜索法的空间复杂度为O(1)。此算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)。

5.心得体会(对本次实践收获及疑惑进行总结)

  我和我的搭档在此题遇到的问题是统计比较次数的num输出不正确。

  我们开始时在main函数内定义,且通过调用int Binarysearch(int a[],int n,int x,int num)来得到下标和比较次数,但我们不确定一次能不能有两个返回值,便尝试运行了一次,答案当然是错误的。函数返回值是下标的值,且下标输出正确,而num输出错误。

  然后我们把num定义为全局变量,修改返回语句为return mid。然而在main函数中输出num一直等于0,在Binarysearch中输出却是正确的次数。

  我们十分疑惑,后来我们在多次尝试修改后,把int Binarysearch(int a[],int n,int x,int num)改为int Binarysearch(int a[],int n,int x),主函数相应部分也修改了,结果就输出正确了。现在想明白了传值调用后num值没有发生改变,故之前num一直等于0。

  收获:这道题应该是三道题中最简单的一道,可我感觉我们在这一道题上花费的时间最多(或者是说超出正常的解题时间很多)。题目虽然简单,但由于我们的基础知识学得不够扎实,而浪费了许多时间,这引起了我们对基础知识的重视,很多事情不能只知其然而不知其所以然。

 

 

  

  

posted on 2018-10-13 13:41  Lucy1234567  阅读(148)  评论(0编辑  收藏  举报