【问题标题】:Using Arrays library to merge sort an int array使用 Arrays 库对 int 数组进行合并排序
【发布时间】:2019-04-21 08:55:18
【问题描述】:

我要使用功能

public static void sort(Object[] a)

要对一个 int 数组进行排序,但我不知道该怎么做,所以我确定它使用的是合并排序而不是任何其他排序。

这里是 Java 文档:https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

为了使用归并排序,我认为下面是该函数的正确实现。

 public static void main(String[] args) {
     int arr[] = { 3, 2, 4, 1, 99, 30, 5, 3 };
     Arrays.sort(arr);
 }

这是正确的吗?此外,我想用

指定一个从哪里开始排序等的索引
sort(Object[] a, int fromIndex, int toIndex)

我将如何确保编写代码以便它使用合并排序而不是快速排序。

【问题讨论】:

  • 您要使用的方法需要一个对象数组。 int[] 是一个整数数组,而不是一个对象数组。为什么要关心算法是归并排序还是快速排序?
  • @JBNizet 我需要将我自己的算法实现与 java 内置算法的实现进行基准测试
  • 那么不要调用 Arrays.sort(int[]),因为它使用的是快速排序,而不是归并排序。请注意,用 Java 编写正确的基准测试是一项非常复杂的任务。如果您还不知道 int 和 Object 之间的区别,那么您可能应该专注于编写基准测试之外的其他事情。首先学习基础知识。

标签: java mergesort


【解决方案1】:

Arrays.sort 方法通常对基元数组使用快速排序,对对象数组使用合并排序。

因此,为了使用合并排序,我猜你必须将你的数组声明为一个整数对象数组,例如

// Unsorted array
Integer[] a = { 2, 6, 3, 5, 1 };

【讨论】:

    【解决方案2】:

    不幸的是,Arrays.sort 两者都用!看起来,对于您的整数实现,它使用了快速排序。

    https://cafe.elharo.com/programming/java-programming/why-java-util-arrays-uses-two-sorting-algorithms/

    【讨论】:

    • 我怎样才能让它只使用归并排序呢?虽然仍在使用数组;而不是收藏等。
    • 尝试使用 Integer 对象而不是 int!您还可以创建自己的实现 Comparable 的类,它应确保从 Arrays.sort 进行合并排序
    【解决方案3】:

    LegacyMergeSort 类中封装的 Arrays 实用程序类中有一个遗留的合并排序实现。

    如前所述,默认情况下 Arrays.sort 不会使用它。所以你需要指示jvm使用它。这是根据 Java 文档:

      Old merge sort implementation can be selected (for
      compatibility with broken comparators) using a system property.
    

    系统属性为java.util.Arrays.useLegacyMergeSort=true,您可以使用java -Djava.util.Arrays.useLegacyMergeSort=true jarSystem.setProperty("java.util.Arrays.useLegacyMergeSort",true); 进行设置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多