Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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_Sorting_Mergesort - Fatal编程技术网

Java 合并排序泛型方法

Java 合并排序泛型方法,java,sorting,mergesort,Java,Sorting,Mergesort,我的合并排序似乎工作不正常。当我显示排序后的列表时,它没有被排序,元素被添加,这里应该有9个,那里有49个。 有人知道我哪里出错了吗 public static <E extends Comparable<E>> void mergeSort(List<E> A) { int n = A.size(); if (n > 1) { int half = n / 2; List<E> B = cop

我的合并排序似乎工作不正常。当我显示排序后的列表时,它没有被排序,元素被添加,这里应该有9个,那里有49个。 有人知道我哪里出错了吗

public static <E extends Comparable<E>> void mergeSort(List<E> A) {
    int n = A.size();
    if (n > 1) {
        int half = n / 2;
        List<E> B = copyPartialArray(A, 0, half);
        List<E> C = copyPartialArray(A, half, n);
        mergeSort(B);
        mergeSort(C);
        merge(B, C, A);
    }
}

public static <E extends Comparable<E>> void merge(List<E> B, List<E> C, List<E> A) {
    int n1 = B.size();
    int n2 = C.size();
    int i = 0;
    int j = 0;
    int k = 0;
    while (i < n1 && j < n2) {
        if (B.get(i).compareTo(C.get(j)) < 0) {
            A.add(k, B.get(i));
            i++;
        }
        else {
            A.add(k, C.get(j));
            j++;
        }
        k++;
    }
    if (i == n1)
        for (int p = j; p < n2; p++) {
            A.add(k, C.get(p)); k++;
        }
    else if (j == n2)
        for (int p = i; p < n1; p++) {
            A.add(k, B.get(p)); k++;
        }
}

private static <E extends Comparable<E>> List<E> copyPartialArray(List<E> A, int first, int last) {
    int n = last - first;
    List<E> copy = new ArrayList<E>(n);
    for (int i = 0; i < n; i++)
    copy.add(i, A.get(first + i));
    return copy;
}
公共静态无效合并排序(列表A){
int n=A.size();
如果(n>1){
int-half=n/2;
列表B=copyPartialArray(A,0,一半);
列表C=复制部分阵列(A,一半,n);
(B);
合并(C);
合并(B、C、A);
}
}
公共静态无效合并(列表B、列表C、列表A){
int n1=B.大小();
int n2=C.大小();
int i=0;
int j=0;
int k=0;
而(i
这个答案会让你意识到问题出在哪里


很明显,mergeSort不会对一个元素数组做任何事情,但是如果有两个元素(例如[2,1]),会发生什么呢?您提到在结果列表(列表A)中有比以前更多的元素。为什么?merge对那个列表做了什么

这个答案会让你意识到问题出在哪里

很明显,mergeSort不会对一个元素数组做任何事情,但是如果有两个元素(例如[2,1]),会发生什么呢?您提到在结果列表(列表A)中有比以前更多的元素。为什么?merge对那个列表做了什么