algorithm - 关于计数排序算法

标签 algorithm analysis

我读过一个计数排序算法,它是这样的:

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

我想知道如果我将最后一个更改为:for j<--1 to n ,算法也会正确吗???(有什么办法可以证明这个“for”算法是正确的???)

这样算法也稳定吗?

谢谢

最佳答案

该算法在两个方面都是正确的。它也很稳定,因为您现在拥有它。

如果你改变最后一个for按照你说的,它会停止稳定。

基本上,C[i] = how many elements <= i exist第三场结束后for环形。所以C[A[j]]为您提供值为 A[j] 的元素的最后位置按排序顺序,C[A[j]] - 1值为 A[j] 的元素的倒数第二个位置等等。这就是为什么要减少 C 中的值的原因.

因此,如果您关心稳定性,则必须开始以相反的顺序迭代原始数组:以便最后一个值为 x 的元素。在您的原始数组中首先放在新数组中。反向迭代原始数组将保证 x放在之后所有其他等于 x 的值,从而使算法稳定。

关于algorithm - 关于计数排序算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3076037/

相关文章:

最小曼哈顿距离算法

java - 获取算法的运行时间

haskell - 函数式编程的分析与设计

python - 使用 Pycparser 解析变量依赖关系

ios - 集合的总和(逻辑)

c# - 为什么使用除法而不是通用哈希法计算哈希码?

algorithm - 什么是 "complexity of operation in the worst case"Big-Oh 或 Big-Omega

preprocessor - 定义CLion分析仪的预处理器符号

project-management - 在开始一个项目时,你从上级那里得到什么样的规范、文件、分析?

c# - 聚合函数。步骤顺序