我做了一个算法复习,我(重新)阅读了一个在线性时间内运行的排序算法,即Counting Sort
。
说实话,我已经忘记了它 我理解结构和逻辑以及它在线性时间内运行的事实是非常有吸引力的质量。
但我有以下问题:
我理解算法的具体实现依赖于两件事:
1)输入数字的范围很小(否则中间数组会很大并且有很多间隙)
2)我们实际上知道数字的范围。
认为这两个假设是正确的(否则请更正我),我想知道这个算法适用的最佳应用领域是什么。
我的意思是特别在Java中,是一个类似于以下Java/Counting sort的实现:
public static void countingSort(int[] a, int low, int high)
{
int[] counts = new int[high - low + 1]; // this will hold all possible values, from low to high
for (int x : a)
counts[x - low]++; // - low so the lowest possible value is always 0
int current = 0;
for (int i = 0; i < counts.length; i++)
{
Arrays.fill(a, current, current + counts[i], i + low); // fills counts[i] elements of value i + low in current
current += counts[i]; // leap forward by counts[i] steps
}
}
或者提出high
和low
并不是一件小事吗?
Java中是否有特定的应用程序计数排序最适合?
我认为有这样的微妙之处,否则为什么有人会烦扰所有的O(nlogn)
算法?
答案 0 :(得分:3)
Algorithms
与语言无关,因此这与语言无关。正如您所说 - 当域很小时使用计数排序。如果您只有三个数字 - 1, 2, 3
,则使用counting sort
,而不是quicksort
,heapsort
或O(nlogn)
的任何内容对其进行排序要好得多。如果您有特定问题,请随时提出。
答案 1 :(得分:0)
在一般情况下,计算排序为O(n)
是不正确的,“小范围的元素”不是推荐,而是关键假设。</ p>
计数排序假设每个元素都是整数 范围1到k,对于某个整数k。 当k = O(n)时,计数排序 在O(n)时间运行。
在一般情况下,键k
的范围与元素n
的数量无关,并且可以任意大。例如,以下数组:
{1,1000000000000000000000000000000000000000000000000000000000000000000000000000}
至于k
和n
的精确收支平衡点,其中计数排序优于传统排序,它非常依赖于实施,最好通过基准测试(尝试两者)完成强>