我看到有两种方法可以在数组中找到中间索引。


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 + lowerBound2N都将是偶数,因此1/2被丢弃。

因此,除非发生溢出(请参阅Rohit的答案),否则这两个语句将产生相同的结果。

10-07 14:12