有序数组插入

时间:2014-05-13 00:59:48

标签: java arrays data-structures

以下是Robert Lafore撰写的“Java中的数据结构和算法”第二版。我们正在使用有序数组尝试在数组中插入一个项目。我通常喜欢在编码时理解线条,但这似乎让我感到懊恼。我理解上半部分在做什么 - 寻找把价值放在哪里。

现在从for(int k = nElems; k> j; k--)开始的第二部分是我被卡住的地方。 我认为这是它试图说的:将k设置为等于原始数组的大小并递减直到其k为大小为j。设置数组位置k等于k-1(或者可能是j-1?)然后...然后我陷入[j] =值;。

有人可以解释一下那里发生的事情吗?我以为数组一旦创建就是不可变的。人们会认为会创建一个全新的阵列。

public void insert(long value)    // put element into array
{
int j;

for(j=0; j<nElems; j++)         // find where it goes
if(a[j] > value) // (linear search)
    break;

for(int k=nElems; k>j; k--)     // move bigger ones up
    a[k] = a[k-1];
a[j] = value;                   // insert it
nElems++;                       // increment size
} 

2 个答案:

答案 0 :(得分:2)

int k=nElems

从最后开始。

k > j

虽然我们还没有达到目标位置......

a[k] = a[k-1];

将当前元素向上移动一个位置。

k--

向左移动。


因此,将目标位置和结束位置之间的所有元素向右移动。

  

我认为数组一旦创建就是不可变的。

数组大小一旦创建就会被修复 - 任何索引处的元素都可以被修改或重新分配,但是你觉得合适。

这里可能做了什么 - 创建了一个更大的数组,并使用nElems来表示填充值的数量 - 其余的索引只是nullWikipedia's article on dynamic arrays简要提到了这一点 - 容量 size 的概念 - 容量为a.length,大小为nElems。这与ArrayList的工作方式相同。

答案 1 :(得分:0)

在插入之前移动现有元素以为新元素腾出空间