实践题目:二分查找
问题描述:
输入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和比较次数; //因为直到循环结束也未找到该值,可知数组不存在该值
用java填写如下:
while (left <= right) {
int middle = (left+right)/2;
if (x == a[middle]) {
time++;
System.out.println(middle);
System.out.println(light);
return;
}
if (x > a[middle]) {
time++;
left = middle + 1;
} else {
time++;
right = middle - 1;
}
}
System.out.println(-1);
System.out.println(light);
算法时间及空间复杂度分析:
执行了一次while循坏,每次循坏范围为上一次的一半,循坏内为O(1),故最坏为O(logn)
空间复杂度为O(1)
心得体会:
通过这次的上机实践,巩固了我对二分法思想的理解,也提高了我将算法思想转化为代码的能力。发挥一个算法的威力的最好方法就是用一个高效的代码将其表示出来,通过这次的实践,我对这句话有了更深的理解,希望以后能在多提高自己算法思想的同时提高自己的编程能力。