【问题标题】:Merge Sort - program not checking two last positions.合并排序 - 程序不检查最后两个位置。
【发布时间】:2017-04-10 18:49:45
【问题描述】:

我的程序有问题。它适用于较少数量的参数,但例如对于输入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

【问题讨论】:

  • 把所有相关代码放在这里。如果代码很多也没关系,只要是最小的重现量即可。
  • 您在数组外部进行索引,导致未定义的行为。找出剩下的地方作为练习。 (在mergeSort 中插入一些跟踪输出。)
  • 当你开始工作时。进行代码审查是个好主意。 codereview.stackexchange.com

标签: c++ sorting merge mergesort


【解决方案1】:

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

    for (int j = 0; j < size; j += (2 * i))
        mergeSort(array, a, j, min(j+i, size), min(j+2*i, size));

对于合并排序函数,它实际上是一个合并函数,这对 if 语句在检查索引是否超出范围之前比较数据。当运行结束时,它也不会复制剩余的数据。这是一个替代方案:

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

请注意,变量 fromtolast 最好命名为 left结束

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2017-08-28
    相关资源
    最近更新 更多