为什么这个合并排序功能不正常?

时间:2017-01-23 01:43:36

标签: java arrays sorting mergesort

由于某种原因,此合并排序将无法正常运行。这几乎是正确的,但并不完全。合并函数在我测试过的所有排序数组上都能正常工作,而mergeSort函数似乎没有任何明显的问题。我错过了什么?

示例输入:7,1,5,6,9,3,8,0,2,1。 排序后,0 1 1 1 1 3 1 5 6 1

每次合并后:

1 1 5 6 9 3 8 0 2 1 
1 1 5 6 9 3 8 0 2 1 
1 1 5 6 9 3 8 0 2 1 
1 1 5 6 9 3 8 0 2 1 
1 1 5 6 9 3 8 0 2 1 
1 1 5 6 9 0 3 0 2 1 
1 1 5 6 9 0 3 0 1 1 
1 1 5 6 9 0 1 1 3 1 
0 1 1 1 1 3 1 5 6 1

将1000作为上限添加到数组的末尾,这样如果数组的大小不同,它们总是完成而没有错误。

void mergeSort(int arr[], int p, int r){
    if(p < r){
        int q = Math.floorDiv(p+r, 2);
        mergeSort(arr,p,q);
        mergeSort(arr,q+1,r);
        merge(arr,p,q,r);
    }
}

void merge(int arr[], int p, int q, int r){
    int n1 = q-p+1;
    int n2 = r-q;

    int merge1[] = new int[n1+1];
    int merge2[] = new int[n2+1];

    for(int i = 0; i<n1; i++)
        merge1[i] = arr[p+i];
    for(int j = 0; j<n2; j++)
        merge2[j] = arr[q+j+1];

    merge1[n1] = 1000;
    merge2[n2] = 1000;

    int i = 0;
    int j = 0;

    for(int k = p; k<r; k++){
        if(merge1[i] < merge2[j]){
            arr[k] = merge1[i];
            i++;
        } else {
            arr[k] = merge2[j];
            j++;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我明白了! merge中的for(int k = p; k<r; k++){函数存在问题。

基本上,r是数组中的最后一个索引。因此,通过迭代到数组的最后一个索引之前,我们每次都错过了最后一个数字。

>更改为>=