我发现Java的Arrays.sort()方法比简单的排序方法(基于计数排序)要慢得多。
我编写了一个程序,比较了我的简单排序技术与Java的Arrays.sort()方法的运行时间。我注意到我的实现运行得更快(与系统方法相比,它需要1/3的时间)。
下面是我的实现。
我跟踪辅助数组中的所有元素,并在返回之前将所有元素复制回主数组。
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);
}
以下是输出:
随机抽取5000000个输入...
系统排序所花费的时间:652.0毫秒
我的排序花费的时间:160.0毫秒
随机输入5000万个输入...
系统排序时间:5737.0毫秒
我的排序花费的时间:2176.0 ms
如果我们可以用内存成本购买大量执行时间(考虑到现在的内存现在便宜了几天),那么为什么不利用它呢?
有什么想法吗? 谢谢。
答案 0 :(得分:1)
因为您将需要size(int)或4 giga的数组,因此您只需要<50M。而且很长时间以来,它实际上是不可能的。尝试一些更聪明的操作,例如至少将count-sort高字节(短),然后对相等的高字节的每个范围,countsort低字节...