因此,有一段基排序实现的Java代码如下所示:
aux[count[a[i]]++] = a[i];为什么使用post增量操作符?为什么不是辅助[count[ai]+1]?post增量是简单地将count[ai]中的值增加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];发布于 2016-05-08 07:18:13
post增量是简单地将count[ai]中的值增加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]]的元素,在增量之前,因为++在这里被用作后增量。
发布于 2016-05-08 07:18:21
这个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]值,它将从aux中获取索引a[i] + 1,但aux[count[a[i]]++]将使用a[i]的索引。
aux[count[a[i]]+1]类似于aux[++count[a[i]]],但区别在于您没有在count[a[i]]中增加值。
https://stackoverflow.com/questions/37097240
复制相似问题