为什么java中的Arrays.sort()方法不使用计数排序技术?
我发现Java的array.sort()方法比我的简单排序方法(基于计数排序)慢得多 我编写了一个程序来比较我的简单排序技术和Java的array.sort()方法的运行时间。我注意到我的实现运行得更快(与系统方法相比需要1/3的时间) 下面是我的实现 我跟踪辅助数组中的所有元素,并在返回之前将所有元素复制回主数组为什么java中的Arrays.sort()方法不使用计数排序技术?,java,sorting,Java,Sorting,我发现Java的array.sort()方法比我的简单排序方法(基于计数排序)慢得多 我编写了一个程序来比较我的简单排序技术和Java的array.sort()方法的运行时间。我注意到我的实现运行得更快(与系统方法相比需要1/3的时间) 下面是我的实现 我跟踪辅助数组中的所有元素,并在返回之前将所有元素复制回主数组 static void mySort(int[] num2, int n) { double startTime, endTime; startTime = Sys
static void mySort(int[] num2, int n)
{
double startTime, endTime;
startTime = System.currentTimeMillis();
int[] sortedData = new int[n];
for (int i = 0; i < n; i++)
sortedData[num2[i]]++;
int index = 0;
for (int i = 0; i < n; i++)
if (sortedData[i] > 0)
{
for (int j = 0; j < sortedData[i]; j++)
{
num2[index++] = i;
}
}
endTime = System.currentTimeMillis();
System.out.println("Time taken for my sort: "
+ (endTime - startTime) + " ms");
}
static void systemSort(int[] num)
{
double startTime, endTime;
startTime = System.currentTimeMillis();
Arrays.sort(num);
endTime = System.currentTimeMillis();
System.out.println("Time taken for System sort: " +
(endTime - startTime) + " ms");
}
public static void main(String[] args)
{
int size = 50000000;
int[] origArray = new int[size];
int[] origArray2 = new int[size];
Random rn = new Random();
System.out.println("Taking " + size + " inputs randomly...");
for (int i = 0; i < size; i++)
{
origArray[i] = rn.nextInt(size);
origArray2[i] = origArray[i];
}
System.out.println("Done!");
System.out.println("\n\nFrom System sort: ");
systemSort(origArray);
System.out.println("\n\nFrom my sort: ");
mySort(origArray2, size);
}
静态void mySort(int[]num2,int n)
{
双开始时间,结束时间;
startTime=System.currentTimeMillis();
int[]sortedData=新int[n];
对于(int i=0;i0)
{
对于(int j=0;j
以下是输出:
随机抽取5000000个输入
系统排序所用时间:652.0毫秒
我的排序所用时间:160.0毫秒
随机抽取50000000个输入
系统排序所用时间:5737.0毫秒
我的排序所用时间:2176.0毫秒
如果我们可以用内存成本购买大量的执行时间(考虑到内存现在一天比一天便宜),那么我们为什么不利用它呢
有什么想法吗?
谢谢。因为您需要大小(int)或4GA的数组,这里您只需要因为您需要大小(int)或4GA的数组,这里您只需要它看起来您有一个要求,数组的值不能大于数组长度-1。内置排序没有这样的要求。你有一个非常特殊的案子。内置排序需要能够处理任何值。是的,你完全正确。这种技术并不适用于所有情况。我明白了。谢谢。它也不处理原始数组中的负数,因为它依赖于为排序数组的索引分配一个等于其值的数字的便利性,Java不允许索引低于零。看起来您有一个要求,数组的值不能大于数组长度-1。内置排序没有这样的要求。你有一个非常特殊的案子。内置排序需要能够处理任何值。是的,你完全正确。这种技术并不适用于所有情况。我明白了。谢谢。它也不处理原始数组中的负数,因为它依赖于为排序数组的索引分配一个等于其值的数字的便利性,Java不允许索引低于零。哦,是的,我可以改进这个。谢谢。让我看看你的解决方案,我会和我比较。除了问题代码中“基准”的缺陷之外,这是正确的考虑。对于任意
int[]
数组,值范围太大,通常无法进行计数排序。请注意,在Java中甚至不可能创建包含2个2²元素的数组,您至少需要两个,并且内存量是4字节×2²元素,换言之是16 GiB。对于byte[]
,short[]
和char[]
,数组。当数组长度对正时,sort
进行计数排序。另请看。哦,是的,我可以改进这个。谢谢。让我看看你的解决方案,我会和我比较。除了问题代码中“基准”的缺陷之外,这是正确的考虑。对于任意int[]
数组,值范围太大,通常无法进行计数排序。请注意,在Java中甚至不可能创建包含2个2²元素的数组,您至少需要两个,并且内存量是4字节×2²元素,换言之是16 GiB。对于byte[]
,short[]
和char[]
,数组。当数组长度对正时,sort
进行计数排序。另见。