java - 使用二进制搜索插入有序数组

标签 java algorithm binary-search

以下是我到目前为止的内容。问题是我如何找到插入点。我在纸上做了一些手绘,我观察到最终下限和上限相等,插入点总是比下限和上限相等时的索引更高。

我知道网上有很多解决方案,但我真的想靠自己去理解,因为我只在自己学习的时候学习和记住一些东西,而不是试图弄清楚其他人是如何想出解决方案的。

如果有人能指导我就太好了。此外,一旦我得到插入点,我就可以做剩下的事情,即将所有值移动一个索引,以便为插入值腾出位置。

   public void insert(long value) {

            int lowerBound = 0;
            int upperBound = nElems - 1;
            int curIn;

            while (true) {
                curIn = (lowerBound + upperBound) / 2;

                if (a[curIn] < value)
                    lowerBound = curIn + 1;
                else
                    upperBound = curIn - 1;

            }

最佳答案

二分搜索必须检查循环内的三种情况:

  1. 搜索到的值小于当前中心元素
  2. 搜索到的值大于当前中心元素
  3. 该值等于当前中心元素(此时搜索结束)

lowerBound 等于 upperBound 并且所讨论的位置时,二分查找应该中止到搜索的值。

反正查找结束的位置就是你要插入值的位置:如果那个位置的值等于你要插入的值,那么你是在这个位置插入还是之后插入都无所谓.如果比较小,就想在这个位置之后插入,如果比较大,就想在这个位置插入。

我不会给出代码,因为 OP 显然只是要求提示。

关于java - 使用二进制搜索插入有序数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24868637/

相关文章:

c - 使用 DFS 递归 AST

java - binarySearch 方法产生 "ArrayIndexOutOfBounds"异常

java - 带过程输出的二分查找

algorithm - 如何更好地理解“每次比较一次”的二进制搜索?

java - 如何更改已运行实例的 Java 类的代码?

c - while 循环中的 if 语句未给出 C 中的预期输出

java - 执行器线程池 - 限制队列大小和最旧的出队

algorithm - OpenJDK :javax.net.ssl.SSLHandshakeException : java. security.cert.CertificateException: 证书不符合算法约束

java - 什么是java中的虚方法调用?

java - 如何检测 Mac OsX 10.7 上是否下载了 JavaVM