移动有序数组

时间:2014-09-06 10:53:17

标签: 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)
    {
        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

问题在于,当我尝试插入数字7时,结果是:

在:

1
3
6
10
15
21
28
0

后:

1
3
6
10
15
21
7
28

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:0)

您必须通过

替换代码的除法范围部分中的测试
if(nElems[curIn] < replaceKey)

您正在将插入索引与要插入的键进行比较。事实上,您所做的是在索引 replaceKey处插入replaceKey 。在你的例子中,7被插入等级6(如果28不是数组的最后一个元素,它将被插入等级7)。

答案 1 :(得分:0)

为什么重新发明轮子而不使用TreeSet?

    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]

答案 2 :(得分:-1)

我们必须释放我们必须插入的点。为了获得自由,我们需要将所需位置上或之后的每个元素移动到下一个位置。为此,下面提供了最佳解决方案。 有问题的解决方案无法正常工作,因为它没有声明在中期之前必须插入的值。

为什么使用这么复杂的代码?让我们看看

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插入所需位置。