这个java post增量运算符在做什么?

时间:2016-05-08 07:12:50

标签: java

所以有一个基数排序实现的Java代码,如下所示:

aux[count[a[i]]++] = a[i];

为什么使用后增量运算符?为什么不 aux [count [a [i]] + 1] ? post增量是否只是将count [a [i]]中的值递增1并将其存储在那里?

radixSort.java

int N = a.length;
int[] count = new int[R+1];
for (int i = 0; i < N; i++)
  count[a[i]+1]++;
for (int r = 0; r < R; r++)
  count[r+1] += count[r];

for (int i = 0; i < N; i++)
  aux[count[a[i]]++] = a[i];
for (int i = 0; i < N; i++)
  a[i] = aux[i];

2 个答案:

答案 0 :(得分:3)

  

帖子增量是否只是将count [a [i]]中的值递增1并将其存储在那里?

是的,确切地说。该语句有两个副作用:一个是对aux元素的修改,另一个是对count中元素的修改。

就个人而言,我会避免这样写 - 我可能会写:

// We don't use i other than to index into a, so use an
// enhanced for loop instead
for (int value : a)
{
    aux[count[value]] = value;
    count[value]++;
}

请注意,即使不需要更改countaux[count[a[i]]+1]也不会做同样的事情 - 因为aux[count[a[i]]++]引用aux中的元素在增量之前索引count[a[i]],因为此处++被用作后增量。

答案 1 :(得分:2)

aux[count[a[i]]++] = a[i];表示:

首先,取a[i]值,并将其用作计数的索引。然后,该值将用作aux数组中的索引,并将a[i]的值放在其位置。然后递增count[a[i]]的位置1上的值。

就像这样:

aux[count[a[i]]] = a[i];
count[a[i]] = count[a[i]] + 1;

但更短。

你也有这个: aux[++count[a[i]]] = a[i];。 这将取自count[a[i]]的值和1的第一个增量,然后将其用作aux数组中的索引,现在我们将其搜索为:

count[a[i]] = count[a[i]] + 1;
aux[count[a[i]]] = a[i];

正如您所看到的,aux[count[a[i]]+1]aux[count[a[i]]++]不同,因为它不会在a[i]中为{1}}增加a[i]的值,并且会占用a[i] + 1来自aux的{​​1}},但aux[count[a[i]]++]的索引为a[i]

aux[count[a[i]]+1]aux[++count[a[i]]]类似,但不同之处在于您没有增加count[a[i]]中的值。