合并排序 - 程序不检查最后两个位置。

时间:2017-04-10 18:49:46

标签: c++ sorting merge mergesort

我的程序有问题。它适用于较少数量的参数,但例如对于输入13 5 10 8 6 22 11 3 12 20 7 9 14 17 19 1 2 18,它返回1,3,5,6,7,8,9,10,11,12,13,14,17,19,20,22,2,18,。我真的不知道可能出现的问题。

功能

void mergeSort(int arr[], int arrSort[], int first, int mid, int last) {
    int from = first;
    int to = mid;
    for (int i = first; i<last; i++) {
        if ((arr[from] <= arr[to] && from<mid) || to >= last) {
            arrSort[i] = arr[from];
            from++;
        } else if ((arr[to]<arr[from] && to<last) || from >= mid) {
            arrSort[i] = arr[to];
            to++;
        }
    }
    for (int i = first; i<last; i++)
        arr[i] = arrSort[i];
}

void mergeSortIter(int array[], int size) {
    int *a = new int[size];
    for (int i = 1; i <= size; i *= 2) {
        showArray(array, size);
        for (int j = i; j <= size; j += (2 * i))
            mergeSort(array, a, j - i, j, min((j + i), size));
    }
}

其余代码

https://pastebin.com/2ugS5ZpZ

1 个答案:

答案 0 :(得分:0)

mergesortIter()的内部循环可以简化(这也可以解决潜在的问题,我没有检查所有可能的问题):

        if (from < mid && (to >= last || A[from] <= A[to])) {
            B[i] = A[from];
            from = from + 1;
        } else {
            B[i] = A[to];
            to = to + 1;    
        }

对于mergesort函数,它实际上是一个合并函数,if语句对在检查索引是否超出范围之前比较数据。当达到运行结束时,它也不会复制剩余的数据。这是另一种选择:

$ sudo apt-get install openjdk-8-jre

请注意,从, last 的变量将更好地命名为 left 正确结束