所以有一个基数排序实现的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];
答案 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]++;
}
请注意,即使不需要更改count
,aux[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]]
中的值。