我创建了自己的合并排序,它有一个只允许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));
}
答案 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
时不断向其中添加元素。它会继续增长,你可能会重复使用它的过时元素。