Java 在进行二进制搜索时,如何设置mid元素?

Java 在进行二进制搜索时,如何设置mid元素?,java,c#,algorithm,data-structures,Java,C#,Algorithm,Data Structures,这个问题听起来可能很幼稚。请原谅。我正在研究一个涉及二进制搜索的问题。我学到的一般方法是 set low = 0, set high = array.Length - 1 while(low < high) mid = (low+high)/2 if (array[mid] == element) return mid if (array[mid] > element) set start = mid +1 if array[mid] < eleme

这个问题听起来可能很幼稚。请原谅。我正在研究一个涉及二进制搜索的问题。我学到的一般方法是

 set low = 0, set high = array.Length - 1
 while(low < high)
   mid = (low+high)/2
   if (array[mid] == element) return mid
   if (array[mid] > element) set start = mid +1
   if array[mid] < element ) set high = mid
请注意我设置中点的方式。但是,我看到的一些示例/解决方案设置了不同的mid,我无法理解这一点。请参阅下面的代码片段。如能解释设置mid=l+r-l/2意味着什么,我们将不胜感激

int BinarySearch(int A[], int l, int r, int key)
 {
   int m;

while( l <= r )
{
    m = l + (r-l)/2;

    if( A[m] == key ) // first comparison
        return m;

    if( A[m] < key ) // second comparison
        l = m + 1;
    else
        r = m - 1;
}

return -1;
}

这样做是为了避免整数溢出问题

使用非单键右移运算符

int mid=(high+low)>>>1
或 ii int中=低+高-低/2

如果总和超过Integer.MAX_值,则低+高/2将溢出,您将得到错误的结果或运行时异常

您可以阅读Josh Bloch的这篇文章:
中间值等于左值的起始索引加上左右之间的范围除以2

假设我们的范围是5到10


5+10-5/2==5+5/2==5+2.5==7.5,我们的范围的中间值在这两种情况下的目标都是找到中间元素

低+高/2:左右指数之和除以2得到中点。问题是这个总数可能会溢出。 如果总和是偶数,我们选择较低的一个。示例-左侧和右侧为[2,5]-我们选择中间为3

l+r-l/2:找到左索引和右索引之间的差值,并除以2。然后将其添加到左索引以查找中点。用一个例子来形象化这一点可能更容易


示例:[5,11]->11-5/2=3此间隔的中间现在是从左索引开始的3个位置或跳数。因此,添加左边的索引以找到mid元素的索引,即5+3=8

这个问题肯定不是java和C中都有。请只标记相关的语言您使用的是java还是C?@不是您我想了解设置中点的逻辑,无论java还是cIf,您只是在寻找逻辑,可能不需要语言标记。或者选择一个特定的。除非绝对相关,否则不要标记多个。@notyou OK请原谅我的语言标记。谢谢Debapriya Biswas。你真棒。这正是我想要的解释: