算法第二章实践报告

实践题目:二分查找

问题描述:

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

算法描述:

       伪代码如下:

       while (左边界left <= 右边界right) {

              middle = (left + right) / 2;

              if (要查找的值 == a数组middle位置的值) {

                     直接输出middle以及搜索次数;

                     终止进程;  //已找到该值,可直接结束程序

              }

              if (要查找的值 > a数组middle位置的值) {  //即值在middle的右侧

                     搜索范围改成middle右侧;

                     搜索次数+1;

              }

              if (要查找的值 < a数组middle位置的值) {  //即值在middle的左侧

                     搜索范围改成middle左侧;

                     搜索次数+1;

              }

       }

       输出-1和比较次数;  //因为直到循环结束也未找到该值,可知数组不存在该值

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

       此程序只执行了一次while循环,且每次循环搜索范围为上一次的一半,且循环内时间复杂度为O(1),因此最坏情况下算法时间复杂度为O(log n)。

       此程序使用辅助空间存储了上界、下界、中间位置以及比较次数,因此空间复杂度为O(1)。

心得体会:

       通过改写二分搜索的算法,使我巩固二分搜索思想的同时,也提高了算法改写的水平。

猜你喜欢

转载自www.cnblogs.com/lxh15018770052/p/9785639.html