简单的二分算法分析(循环的条件)
2016-05-01 23:45
246 查看
网络上的代码如下:
public static int search(int[] array, int dos) {
int low = 0;
int high = array.length -1;
while ((low <= high) && (low <= array.length -1) ) {
int middle = (low + high) >> 1;
System.out.println(low+" " + high+" "+ middle);
if (array[middle] == dos) {
return dos;
}else if (array[middle] < dos) {
low = middle + 1;
}else {
high = middle - 1;
}
}
return -1;
}
思路也很简单也很容易,即使自己实现的时候出现了问题,一直出 -1 ,后来发现是while的判断条件缺少了 “=”(low <= high) && (low <= array.length -1)
(low <= high) 表示下标要小于上标,“=”是保证如果dos是在数组首位或者末尾,因为经过搜索后high会逐渐逼近low,反之亦然,当遍历到首尾数字时,没有“=”无法进入while。经过测试,如果去除此处的“=”,则首位和末尾的数字无法检索出
(low <= array.length -1) 表示 下标不能越界,表示low不能超过数组下表但是可以相等,如果没有“=”,则无法进行最后位数字的判定
本来还有个(high <= array.length -1)的条件,但是high值恒定满足的,所以删去
以上是很简单的问题,望勿粉刺
public static int search(int[] array, int dos) {
int low = 0;
int high = array.length -1;
while ((low <= high) && (low <= array.length -1) ) {
int middle = (low + high) >> 1;
System.out.println(low+" " + high+" "+ middle);
if (array[middle] == dos) {
return dos;
}else if (array[middle] < dos) {
low = middle + 1;
}else {
high = middle - 1;
}
}
return -1;
}
思路也很简单也很容易,即使自己实现的时候出现了问题,一直出 -1 ,后来发现是while的判断条件缺少了 “=”(low <= high) && (low <= array.length -1)
(low <= high) 表示下标要小于上标,“=”是保证如果dos是在数组首位或者末尾,因为经过搜索后high会逐渐逼近low,反之亦然,当遍历到首尾数字时,没有“=”无法进入while。经过测试,如果去除此处的“=”,则首位和末尾的数字无法检索出
(low <= array.length -1) 表示 下标不能越界,表示low不能超过数组下表但是可以相等,如果没有“=”,则无法进行最后位数字的判定
本来还有个(high <= array.length -1)的条件,但是high值恒定满足的,所以删去
以上是很简单的问题,望勿粉刺
相关文章推荐
- Hadoop interview
- 【转/理】函数式编程思维
- Atitit linux获取项目运行环境版本
- 20145301 《Java程序设计》第九周学习总结
- enum-------优雅的定义常量
- Atitit. 查找linux 项目源码位置
- scala implicit 隐式转换
- IntentFilter的匹配规则
- 调用Android摄像头与打开相册
- Atitit. 查找linux 项目源码位置
- Atitit. 查找linux 项目源码位置
- 20145301实验四 Android开发基础
- MATLAB如何定义函数
- ryu控制器的安装
- MAC OS X10.10上Android开发环境搭建
- Atiti. Php Laravel 5.1 环境搭建以及 error 排除
- Atiti. Php Laravel 5.1 环境搭建以及 error 排除
- Leap Motion 探究 【第三篇】
- 从零开始学_JavaScript_系列(14)——dojo(7)(饼图,BorderContainer,hashchange,弹窗)
- Maven 中央仓库地址