这是一种计数排序算法。我想将其最后for
次循环更改为for j<---1 to n
。
我知道这是正确的,但我想为我的一个朋友展示这个。我怎么能写出我的理由呢?请帮我!感谢。
Counting Sort(A[1,..n]) //C[1,...k] is the temporary memory and k is the range of integers
for i<-- 1 to k
C[i]<-- 0
for j<-- 1 to n
C[A[j]]<--C[A[j]]+1
for i<--2 to k
C[i]<--C[i]+C[i-1]
for j<--n downto 1
B[C[A[j]]]<--A[j]
C[A[j]]<--C[A[j]]-1
答案 0 :(得分:3)
以上代码绝对正确。如果从1 to n
更改最后一个循环,则输出将是正确的,但具有相同值的元素的相对顺序将反转。例如 - 如果原始数组只包含3个元素,并且所有这些都被称为5,则在1 to n
的情况下,最后五个将是第一个元素,第二个最后5个将是第二个元素,前5个将是是最后一个元素,即相同元素的相对顺序被颠倒过来。
答案 1 :(得分:1)
不,最后一个循环应该是n downto 1
,因为这会导致排序为stable sort(即如果两个元素相等,它们将保持原始顺序)。
如果将其更改为1 to n
,则列表的所有相等子序列将按相反顺序放置。有时它无关紧要,但有时它确实如此,并且由于使用n downto 1
没有任何缺点,因此应该首选。