改变计数排序算法

时间:2010-06-20 03:25:16

标签: algorithm analysis

这是一种计数排序算法。我想将其最后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

2 个答案:

答案 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没有任何缺点,因此应该首选。