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

时间:2014-07-21 15:15:27

标签: 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;

            }

2 个答案:

答案 0 :(得分:2)

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

  1. 搜索的值小于当前中心元素
  2. 搜索的值大于当前中心elelemt
  3. 该值等于当前中心元素(然后搜索完成)
  4. 二进制搜索应该中止,当lowerBound等于upperBound 时,有问题的位置等于搜索到的值。

    无论如何,搜索结束的位置是您要插入值的位置:如果该位置的值等于您要插入的值,则插入此位置或之后无关紧要。如果它较小,则要在此位置后插入,如果它较大,则要插入此位置。

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

答案 1 :(得分:0)

希望这可能有所帮助:

public void insert(long value) {
    int lowerBound = 0;
    int upperBound = nElems - 1;
    int curIn;

    while (lowerBound!=upperBound) { //terminating condition - otherwise you will obtain an infinite loop.
        curIn = (lowerBound + upperBound) / 2;
        //take a choice: put your element immediately before a greater element.
        if (a[curIn] <= value) { //also the same value must be managed as more little than the current.
            lowerBound = curIn + 1;
        } else {
            //You cannot skip curIn lowering down the upper limit, curIn should be the position you are looking for.
            upperBound = curIn; // - 1;
        }
    }

    insert_in_list( value, curIn ); //do it as you wish. place the new element in the curIn position
}