java - 归并排序错误

标签 java algorithm sorting methods merge

我做了自己的归并排序,它有一个只允许 ArrayList 和 Comparator 的方法。我的同事要求我通常声明到“merge”方法中的tmp Array必须声明到第一个包装器方法(mergeSort)中。现在,如果我用 3 个元素执行测试,它就不起作用。为什么?

public static < T > void mergeSort(ArrayList < T > array, Comparator < T > c) {
    int high = array.size()-1;
    sort(array, c, 0, high, new ArrayList < T > (high + 1));
  }  

  protected static < T > void sort(ArrayList < T > array, Comparator < T > c, int low, int high, ArrayList < T > tmp) {
    if (low < high) {
      int mid = low + (high - low) / 2;
      sort(array, c, low, mid, tmp);
      sort(array, c, mid + 1, high, tmp);
      merge(array, c, low, mid, high, tmp);
    }
  }

  protected static < T > void merge(ArrayList < T > array, Comparator < T > c, int p, int mid, int q, ArrayList < T > tmp) {
    int i = p;
    int j = mid + 1;
    int k = 0;
    for (; i <= mid && j <= q; k++) {
      if (c.compare(array.get(i), array.get(j)) < 0)
        tmp.add(k, array.get(i++));
      else
        tmp.add(k, array.get(j++));
    }
    if (i <= mid && j > q) {
      while (i <= mid)
        tmp.add(k++, array.get(i++));
    } else {
      while (j <= q)
        tmp.add(k++, array.get(j++));
    }
    for (k = 0; k < tmp.size(); k++)
      array.set(k + p, tmp.get(k));
  }

最佳答案

由于您的 tmp ArrayList以前是 merge 的本地方法,这意味着在将其移动到 mergeSort 之后调用,它应该在每次调用 merge 之前被清除:

protected static < T > void merge(ArrayList < T > array, Comparator < T > c, int p, int mid, int q, ArrayList < T > tmp) {
    tmp.clear();
    ...
}

如果不清除它,您将在每次调用 merge 时继续向其中添加元素。 .它会不断增长,您可能会重复使用其中过时的元素。

关于java - 归并排序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50150271/

相关文章:

java - 减少查询执行次数

c - 为什么矩阵乘法算法中的循环顺序会影响性能?

algorithm - 合并未知数量的数组

arrays - 如何在R中制作和排序元组数组

php - 从多列排序

regex - 为什么在我的正则表达式模式中使用 POSIX 字符类会产生意想不到的结果?

java - 如何在android中设置微调文本

java - 为什么我的 TabListener 不起作用?

java - 我可以设置 Git 在每次修改某个文件时通知我吗

c - 用 C 编写一个程序,输出给定数字之间的丰富数字序列的第一项和项数