Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 合并排序错误_Java_Algorithm_Sorting_Methods_Merge - Fatal编程技术网

Java 合并排序错误

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()-

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

也许您可以比“它不工作”更具体一些。请给出一个具体的输入和输出示例来说明您的问题。