为什么Java中的Arrays.sort()方法不使用计数排序技术?

时间:2019-06-04 16:57:04

标签: java sorting

我发现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

如果我们可以用内存成本购买大量执行时间(考虑到现在的内存现在便宜了几天),那么为什么不利用它呢?

有什么想法吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

因为您将需要size(int)或4 giga的数组,因此您只需要<50M。而且很长时间以来,它实际上是不可能的。尝试一些更聪明的操作,例如至少将count-sort高字节(短),然后对相等的高字节的每个范围,countsort低字节...