Java 移位有序数组

Java 移位有序数组,java,arrays,algorithm,Java,Arrays,Algorithm,我正在尝试在有序数组中插入一个数字。为了实现这一点,我搜索最后一个小于或等于搜索数字的数字。从那里我想把数组的那部分移到右边 int lowerBound = 0; int upperBound = nElems.length-1; int curIn = 0; boolean check = true; while(check) { curIn = (lowerBound + upperBound ) / 2; if(nElems[curIn] == replaceKey)

我正在尝试在有序数组中插入一个数字。为了实现这一点,我搜索最后一个小于或等于搜索数字的数字。从那里我想把数组的那部分移到右边

int lowerBound = 0;
int upperBound = nElems.length-1;
int curIn = 0;
boolean check = true;
while(check)
{
    curIn = (lowerBound + upperBound ) / 2;
    if(nElems[curIn] == replaceKey)
    {
        for(int i = nElems.length - 2; i >= curIn - 1; i--)
        {
            nElems[i + 1] = nElems[i];
        }
        nElems[curIn] = replaceKey;
        check = false;// found it
    }
    else if (lowerBound > upperBound)
    {
        for(int i = nElems.length - 2; i >= curIn - 1; i--)
        {
            nElems[i + 1] = nElems[i];
        }
        nElems[curIn] = replaceKey;
        check = false;// found it
        //return nElems; // can’t find it
    }
    else // divide range
    {
        if (curIn < replaceKey)
        {
            lowerBound = curIn + 1; // it’s in upper half
        }
        else
        {
            upperBound = curIn - 1; // it’s in lower half
        }
    } // end else divide range
} // end while
之后:

1
3
6
10
15
21
7
28

有人能帮我吗?

我们必须释放插入点。为了释放,我们需要将所需位置上或之后的每个元素移动到下一个位置。为此,下面提供了最佳解决方案。 有问题的解决方案不起作用,因为它没有必须在mid之前插入的值的语句

为什么要使用如此复杂的代码。让我们看看

int x=7;int i; for(i = nElems.length - 2; i >=0; i--) { if(nElems[i]>x) nElems[i + 1] = nElems[i]; } nElems[i]=x;

此代码将在所需位置插入元素x。

您必须将代码的“除法范围”部分中的测试替换为

if(nElems[curIn] < replaceKey)

您正在将插入索引与要插入的键进行比较。实际上,您所做的是在索引replaceKey处插入replaceKey。在您的示例中,7是在第6列插入的,如果28不是数组的最后一个元素,它将在第7列插入。

为什么要重新发明轮子而不使用树集

    Collection<Integer> nums = Arrays.asList(1, 3, 6, 10, 15, 21, 28, 0);

    SortedSet<Integer> sortedNumbers = new TreeSet<Integer>(nums);

    sortedNumbers.add(7);

    System.out.println(sortedNumbers); // [0, 1, 3, 6, 7, 10, 15, 21, 28]

这不是一个完整的答案,而是一个普遍而重要的提示:将其分为两个方法:一个用于搜索插入索引,另一个用于执行插入。您还可以澄清可能在右侧退出的元素会发生什么情况……我知道,我稍后会这样做。我要试试这个,谢谢@pzaenger Java不足以解决您的问题,但您可能希望在nElems[curIn] Collection<Integer> nums = Arrays.asList(1, 3, 6, 10, 15, 21, 28, 0); SortedSet<Integer> sortedNumbers = new TreeSet<Integer>(nums); sortedNumbers.add(7); System.out.println(sortedNumbers); // [0, 1, 3, 6, 7, 10, 15, 21, 28]