简单算法--二分查找

我决定每天一道算法题了,题目难度要求不大。但是最起码要求代码一遍过,主要锻炼自己写代码风格和方式以及思路吧。贵在坚持吧。今天做一个最简单的二分查找题。

题目:给一个有序数组,要求用二分查找找到指定数据的索引位置。

public int binarySearchIndex(int searchData, int[] array) {
		if (array == null || array.length == 0) {
			return -1;
		}
		
		int low = 0;
		int high = array.length - 1;
		int middle;
		
//		确认是由小到大还是由大到小
		
		if (array[low] < array[high]) {
//			是由小到大
			while (low < high) {
//				找中间位置
				middle = (high - low) / 2 + low;
				System.out.println("由小到大, middle = " + middle);
				
				if (searchData < array[middle]) {
					high = middle;
					high--;
					continue;
				} else if (searchData > array[middle]) {
					low = middle;
					low++;
					continue;
				} else {
					return middle;
				}
			}
		} else {
//			是由大到小
			while (low < high) {
//				找中间位置
				middle = (high - low) / 2 + low;
				System.out.println("由大到小, middle = " + middle);
				if (searchData < array[middle]) {
					low = middle;
					low++;
					continue;
				} else if (searchData > array[middle]) {
					high = middle;
					high--;
					continue;
				} else {
					return middle;
				}
			}
		}
		return -1;
	}

结果:运行是对的,但是没有做到一遍过。 出现了死循环。原因是:

1 对于middle = (high - low) / 2 + low; 这段代码,我开始使用的不是 除号,而是右移, 即 middle = (high - low) >>1 + low;这种样子,因为我知道右移一位就是代表除以2,并且速度更快。但是就是出错了,,于是我怀疑是不是我的右移用错了,或者是我记错了右移不是除以2???于是我就专门写了代码测试,发现右移一位就是除以2,这个的的确确是千真万确的。那么我的问题到底出在哪里?于是我就先试了一下除以2,发现运行结果比原先好多了。但是我就纳了闷了。为什么除以号可以右移就会死循环??很明显采用右移计算的位置并不是我想要的位置!难道是我的写法错误了?后来就抱着试试看的态度,加了一个括号改成了: middle = ((high - low) >> 1) + low;  这个样子,发现运行正常了。

但是为什么会这么不正常呢?为什么非要加括号呢?于是我想打印不加括号得到的到底是什么东东,结果惊喜就来了:

这样写的时候竟然报错!什么鬼啊。编辑器给的提示是这个:

好吧,我想可能是String操作,不认识>>到底是个什么意思吧。这个线索断掉了。那么还有木有其他的原因导致必须得加上括号才正确呢?会不会是 左移右移操作得到的其实是一个二进制?然后再用上 + 号的话 ,会不行?求教啊求教!

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

娅娅梨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值