我正在完成一项任务,教授并不希望我们使用任何其他代码来插入除他提供的伪代码之外的其他值。
简要说明我正在做什么。我正在创建一个动态的整数数组,它们将按顺序插入(从最低到最高)。
这是他提供的伪代码:
for (i = valueNum - 1; array[i] is the wrong spot for newValue; --i) array[i] = array[i-1]
其中array [i]是newValue的错误位置:
(i > 0) AND (value at array[i-1] is greater than newValue)
他还包括这些信息:
您还应该说服自己,上述伪代码适用于(即,它也涵盖)要存储的新值是#1值的情况,即要存储的新值大于或者等于最高现有值,以及要存储的新值小于或等于最低现有值的情况。
所以,看起来很简单。我试了一下:
void IntArray::insert(int nInt)
{
/* check if resize is needed */
if(mySize == capacity)
{
int newCapacity = capacity * 1.5;
if(newCapacity == capacity)
newCapacity = capacity + 1;
capacity = newCapacity;
}
/* here is where my mistake was */
int i;
mySize++;
for(i = mySize -1; i > 0 && data[i-1] > nInt; --i)
{
data[i] = data[i - 1];
}
data[i] = nInt;
}
似乎它正确遵循了伪代码,但如果mySize
为0或1,它似乎不会起作用。有人能指出我正确的方向吗?
答案 0 :(得分:1)
在各种评论中,我说:
只是在不改变存储的情况下改变容量对它没有多大帮助,是吗?你不需要分配一些东西吗?你也永远不会真正存储新值。
和(温和编辑):
更新(定时2014-02-10 19:19:10Z)看起来像我期望使用的。当
mySize
最初为0时,它显然有效;您将其增加到1,然后设置i = 0
并倒计时(无操作),最后设置为data[0] = nInt;
。如果有一行,则新行可以比现有行大,或者小于或等于现有行。如果它更大,则i
不会递减,因此新条目将进入您想要的data[1]
。如果它更小,则i
递减,旧值向上移动循环体,并将新值插入到data[0]
所需的位置。冲洗并重复......