合并排序错误

吉姆·贝鲁希2

我进行了自己的合并排序,该合并排序的方法仅允许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它只会不断增长,您可能会重复使用过时的元素。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章