gpt4 book ai didi

java - 归并排序错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:54:29 26 4
gpt4 key购买 nike

我做了自己的归并排序,它有一个只允许 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com