以下是我到目前为止的情况。问题是如何找到插入点。我在纸上做了一些手跟踪,我观察到的最终是下限和上限相等,插入点总是比它们相等的下限和上限索引更高的索引。
我知道网上有很多解决方案,但我真的想自己理解这个,因为我只学习并记住我自己学习的东西,而不是试图弄清楚其他人如何提出解决方案。
如果有人可以指导我,那就太好了。此外,一旦我得到插入点,我可以做其余的操作,将所有值移动一个索引,使其为插入值的位置。
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;
}
答案 0 :(得分:2)
二进制搜索必须检查循环内的三种情况:
二进制搜索应该中止,当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
}