合并排序时出错

时间:2018-05-03 08:22:41

标签: java algorithm sorting methods merge

我创建了自己的合并排序,它有一个只允许ArrayList和Comparator的方法。我的同事要求我通常在“merge”方法中声明的tmp数组必须声明为第一个包装器方法(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));
  }

1 个答案:

答案 0 :(得分:1)

由于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时不断向其中添加元素。它会继续增长,你可能会重复使用它的过时元素。