我正在尝试在有序数组中插入数字。为了实现此目的,我搜索小于或等于搜索到的数字的最后一个数字。从那里我想将数组的那一部分移到右边。
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
有人可以帮助我吗?
答案 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插入所需位置。