算法第二章实践报告
实践题目:二分查找
问题描述:
输入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)。
心得体会:
通过改写二分搜索的算法,使我巩固二分搜索思想的同时,也提高了算法改写的水平。