Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/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 自定义排序算法性能(vs Arrays.sort()和parallelSort())_Java_Arrays_Sorting - Fatal编程技术网

Java 自定义排序算法性能(vs Arrays.sort()和parallelSort())

Java 自定义排序算法性能(vs Arrays.sort()和parallelSort()),java,arrays,sorting,Java,Arrays,Sorting,我用Java实现了一个基本的排序算法,并将其性能与本机方法(Arrays.sort()和Arrays.parallelSort())进行了比较。节目如下 public static void main(String[] args) { // Randomly populate array int[] array = new int[999999]; for (int i = 0; i < 999999; i++) array[i] = (int)M

我用Java实现了一个基本的排序算法,并将其性能与本机方法(Arrays.sort()和Arrays.parallelSort())进行了比较。节目如下

 public static void main(String[] args) {
    // Randomly populate array
    int[] array = new int[999999];
    for (int i = 0; i < 999999; i++)
        array[i] = (int)Math.ceil(Math.random() * 100);

    long start, end;

    start = System.currentTimeMillis();
    Arrays.sort(array);
    end = System.currentTimeMillis();
    System.out.println("======= Arrays.sort: done in " + (end - start) + " ms ========");

    start = System.currentTimeMillis();
    Arrays.parallelSort(array);
    end = System.currentTimeMillis();
    System.out.println("======= Arrays.parallelSort: done in " + (end - start) + " ms ========");

    start = System.currentTimeMillis();
    orderArray(array);
    end = System.currentTimeMillis();
    System.out.println("======= My way: done in " + (end - start) + " ms ========");
}


private static int[] orderArray(int[] arrayToOrder) {
    for (int i = 1; i < arrayToOrder.length; i++) {
        int currentElementIndex = i;
        while (currentElementIndex > 0 && arrayToOrder[currentElementIndex] < arrayToOrder[currentElementIndex-1]) {
            int temp = arrayToOrder[currentElementIndex];
            arrayToOrder[currentElementIndex] = arrayToOrder[currentElementIndex-1];
            arrayToOrder[currentElementIndex-1] = temp;
            currentElementIndex--;
        }
    }
    return arrayToOrder;
}
这独立于:

  • 数组中的元素数(在我的示例中为999999)
  • 执行排序的次数(我在for循环中尝试并迭代了很多次)
  • 数据类型(我尝试使用double数组而不是int数组,没有发现任何差异)
  • 我调用每个排序算法的顺序(不影响性能的总体差异)
显然,我的算法不可能比Java提供的算法更好。我只能想到两种可能的解释:

  • 我衡量绩效的方式存在缺陷
  • 我的算法太简单,缺少一些角点情况
我认为后者是正确的,因为我使用了一种相当标准的方法来衡量Java的性能(使用System.currentTimeMillis())。然而,我已经对我的算法进行了广泛的测试,到目前为止还没有发现任何谬误——一个int有预定义的边界(Integer.MIN_值和MAX_值),不能为null,我想不出有什么可能的情况我没有涉及到

我的算法的时间复杂度(O(n^2))和本机方法(O(n log(n))),这显然会造成影响。然而,我相信我的复杂性已经足够了

我能从局外人那里了解一下这一点吗,这样我就知道如何改进我的算法了

非常感谢,


Chris。

您正在对一个数组进行排序,但没有在每个轨迹之间对数组进行置乱。这意味着您正在对最佳情况进行排序。在每次调用数组排序方法之间,可以重新创建数组

for (int i = 0; i < TEST_SIZE; i++)
    array[i] = (int)Math.ceil(Math.random() * 100);
for(int i=0;i
完成此操作后,您会注意到您的算法大约慢100倍


也就是说,这并不是比较这些方法的最佳方法。至少,您应该为每个不同的算法对相同的原始数组进行排序。您还应该对每个算法执行多次迭代,并平均响应。单次试验的结果是虚假的,作为一个好的比较是不可靠的

您正在对阵列进行适当排序,但没有在每个轨迹之间对阵列进行置乱。这意味着您正在对最佳情况进行排序。在每次调用数组排序方法之间,可以重新创建数组

for (int i = 0; i < TEST_SIZE; i++)
    array[i] = (int)Math.ceil(Math.random() * 100);
for(int i=0;i
完成此操作后,您会注意到您的算法大约慢100倍


也就是说,这并不是比较这些方法的最佳方法。至少,您应该为每个不同的算法对相同的原始数组进行排序。您还应该对每个算法执行多次迭代,并平均响应。单次试验的结果是虚假的,作为一个好的比较是不可靠的

您正在对数组进行排序,但没有在每个轨迹之间对数组进行置乱。可能的重复意味着:您在第一次排序调用后对已排序的数组进行排序。注意:您需要确保代码已预热。我将重复运行此操作,直到代码不再预热。e、 g.多次运行整套测试,忽略前30-120秒。当您第一次运行代码时,它会在运行一段时间后进行解释,例如10000个循环,它会在后台分一两个阶段编译为本机代码。只有在代码完全编译成本机代码后,您才能看到它的速度有多快,但您没有在每个轨迹之间对数组进行重新置乱。可能的重复意味着:您在第一次排序调用后对已排序的数组进行排序。注意:您需要确保代码已预热。我将反复运行此操作,直到代码不再预热。e、 g.多次运行整套测试,忽略前30-120秒。当您第一次运行代码时,它会在运行一段时间后进行解释,例如10000个循环,它会在后台分一两个阶段编译为本机代码。只有在代码完全编译成本机代码后,您才能看到它的速度有多快。好吧,奇怪的是,我确信调用每个算法的顺序对基准测试没有影响。。。但现在我实现了排序之间的数组置乱,基准测试确实与您描述的匹配。正如你所说,对每个算法的相同原始数组进行排序也是有意义的,真不敢相信我没有想到。。。谢谢你的回答。好吧,奇怪的是,我确信我调用每个算法的顺序对基准测试没有影响。。。但现在我实现了排序之间的数组置乱,基准测试确实与您描述的匹配。正如你所说,对每个算法的相同原始数组进行排序也是有意义的,真不敢相信我没有想到。。。谢谢你的回答。