我看到有两种方法可以在数组中找到中间索引。int middle = lowerBound + (upperBound-lowerBound)/2
int middle = (lowerBound + upperBound)/2
是同一件事吗?还是应该不同地使用它们?由于我试图理解二进制搜索和合并排序。两者都必须使用它。
非常感谢。
最佳答案
如果这是简单的代数,则这两个表达式将是等效的。复杂的是,x/2
与您在代数中学习的除法不同,因为/
是整数除法,并且如果x
是奇数,它将丢弃小数部分。仅当upperBound - lowerBound
为奇数时,这才有所不同。所以说这很奇怪,特别是2N+1
,所以upperBound
= lowerBound + 2N + 1
。然后第一个表达式变为
lowerBound + ((2N + 1) / 2)
与
lowerBound + N
相同,因为多余的1/2被丢弃了。第二个成为(lowerBound + (lowerBound + 2N + 1)) / 2
与
lowerBound + N
相同; lowerBound + lowerBound
和2N
都将是偶数,因此1/2被丢弃。因此,除非发生溢出(请参阅Rohit的答案),否则这两个语句将产生相同的结果。