Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java应用程序中的计数排序和使用_Java_Algorithm_Sorting - Fatal编程技术网

Java应用程序中的计数排序和使用

Java应用程序中的计数排序和使用,java,algorithm,sorting,Java,Algorithm,Sorting,我做了一个算法复习,我重新阅读了一个在线性时间内运行的排序算法,即计数排序 老实说,我已经忘了这件事。 我理解它的结构和逻辑,它在线性时间内运行是一个非常有吸引力的特性 但我有以下问题: 据我所知,算法的具体实现依赖于两件事: 1输入数字的范围很小,否则中间数组会很大,并且有很多间隙。 我们实际上知道数字的范围 考虑到这两个假设是正确的,请纠正我,否则,我想知道这个算法适用的最佳应用领域是什么。 我的意思是,特别是在Java中,以下实现是否足够: public static void count

我做了一个算法复习,我重新阅读了一个在线性时间内运行的排序算法,即计数排序

老实说,我已经忘了这件事。 我理解它的结构和逻辑,它在线性时间内运行是一个非常有吸引力的特性

但我有以下问题: 据我所知,算法的具体实现依赖于两件事: 1输入数字的范围很小,否则中间数组会很大,并且有很多间隙。 我们实际上知道数字的范围

考虑到这两个假设是正确的,请纠正我,否则,我想知道这个算法适用的最佳应用领域是什么。 我的意思是,特别是在Java中,以下实现是否足够:

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
    }
}
或者说它不是一件琐碎的事情来提出高和低

Java中是否有最适合计数排序的特定应用程序


我假设有这样的微妙之处,否则为什么有人会为所有的Onlogn算法而烦恼呢?

算法与语言无关,所以这是语言不可知论。正如您所说的-当域很小时使用计数排序。如果您只有三个数字-1、2、3,那么使用计数排序对它们进行排序要比使用快速排序、堆排序或任何仅限于此的方法要好得多。如果您有特定的问题,请随时提问。

如果说“计数排序”处于启用状态,则不正确。在一般情况下,元素的小范围不是建议,而是关键假设

计数排序假定每个元素都是 范围1到k,对于某些整数k。当k=On时,计数排序 准时到达

在一般情况下,键k的范围与元素n的数量无关,可以任意大。例如,以下数组:

{1100000000000000000000000000000000000000000000000000000000000000000000000000000000000}


至于k和n的确切盈亏平衡点值,其中计数排序优于传统排序,这在很大程度上取决于实现,最好通过基准测试来尝试两者。

是的,你是对的。但是特定算法的某些属性仍然使它们在某些环境中比另一种更合适。我想寻找的答案是,例如,我们在Android应用程序中广泛使用计数排序,因为它很快,并且出于以下原因等。@user384706-计数排序不会更快,因为平台是安卓。如果在这种情况下它是合适的算法,那么应该使用它,不管它是Android、Java、PHP、C、Ruby on Rails还是其他什么。Petar:是的,当然Android不会更快。但是对于具有特定性能要求的应用程序,例如移动应用程序等,我认为计数排序非常有吸引力。但它是否更受欢迎,或者它所依赖的这些假设,实际上使它不容易被如此频繁地使用?也许你对算法的复杂性感到困惑。无论平台或语言是什么,算法复杂度都是相同的。当数字很大时,计数排序真的很糟糕。因此,如果你知道数字可能很大,不要使用它。这取决于一个简单的事实,即数字很小。当你知道数字会很小的时候——用它。@PetarMinchev顺便说一句,当你说。。。如果你只有三个数字-1,2,3。。。这意味着有三种类型的数字,对吗?例如,{2,2,3,1,2,3,3,3,1,1,2,3,1,3,2,3,2,1}是计数排序的好候选者,对吗?