java mergeSort奇怪的输出

时间:2017-02-25 17:10:17

标签: java

public static int[] mergeArray(int[] a, int[] b) {
    int[] result = new int[a.length + b.length];

    int i = 0; // to index array a
    int j = 0; // to index array b

    for (int k = 0; k < result.length; k++) {
        if(a.length == i+1) {
            result[k] = b[j-1];
            j++;
        }else if(b.length == j+1) {
            result[k] = a[i-1];
            i++;
        }else if(a[i] > b[j]) {
            result[k] = b[j];
            j++;
        }else if(a[i] < b[j]) {
            result[k] = a[i];
            i++;
        }
    }
    return result;
}

// this method does the same thing as sortArray but much more efficiently
// it uses meregeArray
public static int[] mergeSortArray(int[] poop) {
    int[] p1 = new int[poop.length/2];
    int[] p2 = new int[poop.length-p1.length];
    for (int i = 0; i<p1.length; i++) {
        p1[i] = poop[i];
    }
    for (int i = 0; i<p2.length; i++) {
        p2[i] = poop[i+p1.length - 1];
    }
    sortArray(p1);
    sortArray(p2);
    return mergeArray(p1, p2);
}

public static void main(String[] args) {
    int[] poop = new int[] {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
    String s = "";
    for(int i : mergeSortArray(poop)){
        s += i + ", ";
    }
    System.out.println(s);
}

代码接受一个int []并将其转换为两个,然后对其进行排序,但错误似乎在输出中,如下所示,它输出两个6,这是奇怪的,我不确定,任何非常感谢帮助:)

这是输出: 1,2,3,4,5,6,7,6,8,9,

感谢所有帮助的人:)

1 个答案:

答案 0 :(得分:1)

首先,你并不比宇宙中的其他人聪明。内部Java使用mergeSort和其他有效的算法,例如在source code of java.util.Arrays

中可以看到

其次,我相信行中有一个错误

    p2[i] = poop[i+p1.length - 1]; // bad
    p2[i] = poop[i+p1.length];     // good

由于这个错误,错误地将数组拆分为从输出中删除10

第三,mergeArray中存在一个错误,应该是

    if(a.length == i) {
        result[k] = b[j];
        j++;
    } else if(b.length == j) {
        result[k] = a[i];
        i++;

这是重复“6”

的结果

正如TDG所说,学习调试代码是一项至关重要的技能,你应该学习。