Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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中的Arrays.sort()方法不使用计数排序技术?_Java_Sorting - Fatal编程技术网

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

为什么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

我发现Java的array.sort()方法比我的简单排序方法(基于计数排序)慢得多

我编写了一个程序来比较我的简单排序技术和Java的array.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);
}
静态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
进行计数排序。另见。