算法第二章上机实践报告

实践题目

7-1 二分查找

 

 

问题描述

输入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

 

算法描述

二分查找属于分治法。

首先设置一个循环(while(left <= right)),比较待查找值X和数组中间位置元素a[mid],如果它们相等,算法结束。如果Xa[mid],则对数组的后半部分执行该操作(left = mid + 1)。

同时,为了满足题目要求,设置计数器flag(此处应用count比较好,命名更规范),循环每进行一次(更准确地说,X每与a[mid]比较一次),则计数器+1,这样就可以返回比较的次数。

 

算法时间及空间复杂度分析

时间复杂度:

二分查找算法的时间复杂度实际上就是循环语局执行的次数。

待查找的数组里一共n个元素,每一次循环后,待查找数组长度变成n/2、n/4......以此类推直到变成n/2^k(k为循环次数)。

令n/2^k=1,可得k=log2n。即二分查找的时间复杂度为O(log2n)。

空间复杂度:

二分查找算法的空间复杂度为O(1),因为每个变量空间复杂度都是O(1)。

 

心得体会

本次上机让我更熟练地掌握了二分查找算法,也从本质上进一步理解了这个基本的算法。

在写代码的过程中,还是有一些混淆的地方,例如,计数器+1的语句应该是在a[mid]和X比较的语句之后就设置,这样才能保证计数结果是正确的。编写代码的时候,在这个点卡了比较久,还是对程序的运行过程和算法的逻辑理解不够深,需要多多练习。

你可能感兴趣的:(算法第二章上机实践报告)