【发布时间】:2012-01-26 15:22:15
【问题描述】:
在处理“The fastest sort for BrainF***"”时,我发现了这个算法,它是 O(N*k),其中 k 是输入中的最大值。它需要 O(N) 额外的存储空间。
物理类比是你有 N 叠代币。堆栈的高度表示要排序的值。 (每个令牌代表一个位)。为另外 N 个堆栈留出空间。您从每个有标记的堆栈顶部取出一个标记,然后从右到左将一个标记添加到新组中的每个堆栈中,直到您的手为空。重复直到所有原始堆栈都为空。现在新集合从左到右升序排序
在 C 中:
void sort(int A[], int N)
{
int *R = calloc(N,sizeof(int));
do {
int i,count=0;
for (i=0;i<N;i++) if A[i] { count++; A[i]--;}
for (i=0;i<count;i++) R[i]++;
} while (count);
memcpy(A,R,N); //A is now sorted descending.
free(R);
}
这个算法有名字吗?看起来和Bead Sort很像,但我觉得不太一样。
【问题讨论】:
-
理解了代码才理解类比是不是很糟糕? ;-) 我主要是因为您要分类的不是硬币而是硬币数量所代表的数字这一事实使我感到困惑。因此,只要有相同数量的相同大小的硬币堆,一枚硬币最终放在哪个堆中并不重要。但不知道这种类型叫什么,但听起来肯定应该有一个名字。 ;-)
-
试图更新解释。 (当我开始使用其他网站上的代码时,它对计数排序感到困惑 - 我赢不了:)
-
这是一个非常有趣的问题。我会说这是一个珠子排序,除了维基百科页面说它是 O(n^2) 空间复杂度。我找不到一个简单的珠排序实现来正确比较它。 :)
-
维基百科关于算法和数据结构的陈述最好持保留态度。我怀疑,但我懒得证明,一个只是另一个更节省空间的转换。
标签: algorithm sorting identify