Java 合并排序错误
我制作了自己的合并排序,它有一个只允许ArrayList和Comparator的方法。我的同事要求将我通常声明为“merge”方法的tmp数组声明为第一个包装器方法(mergeSort)。现在,如果我用3个元素执行一个测试,它将不起作用。为什么?Java 合并排序错误,java,algorithm,sorting,methods,merge,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()-
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));
}
publicstaticvoidmergesort(ArrayListarray,Comparatorc){
int high=array.size()-1;
排序(数组,c,0,高,新数组列表(高+1));
}
受保护的静态无效排序(ArrayList数组、比较器c、int-low、int-high、ArrayListtmp){
如果(低<高){
int mid=低+(高-低)/2;
排序(数组、c、低、中、tmp);
排序(数组、c、中+1、高、tmp);
合并(数组、c、低、中、高、tmp);
}
}
受保护的静态无效合并(ArrayListarray,Comparatorc,int p,int mid,int q,ArrayListtmp){
int i=p;
int j=mid+1;
int k=0;
对于(;i,由于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();
...
}
protectedstaticvoid merge(ArrayListarray,Comparatorc,int p,int mid,int q,ArrayListtmp){
tmp.clear();
...
}
如果不清除它,您将在每次调用merge
时不断向其添加元素。它将不断增长,您可能会重复使用其中过时的元素。也许您可以比“它不工作”更具体一些。请给出一个具体的输入和输出示例来说明您的问题。