【问题标题】:Merge sort implementation in C++C++中的归并排序实现
【发布时间】:2014-04-21 14:44:15
【问题描述】:

我正在学习如何在c++中实现归并排序,遇到了如下问题。

这是我的合并函数,它将两个排序数组合并为一个排序数组。

void merge(int *list, int *final, int start, int mid, int stop) {
    int h = start;
    int i = start;
    int j = mid + 1;

    while ((h <= mid) && (j <= stop)) {
        if (list[h] <= list[j]) {
            final[i] = list[h];
            h++;
        } else {
            final[i] = list[j];
            j++;
        }
        i++;
    }

    /* CODE A */
    if (h > mid) {
        for (int k = j; k <= stop; k++) {
            final[i] = list[k];
            i++;
        }
    } else {
        for (int k = h; k <= mid; k++) {
            final[i] = list[k];
            i++;
        }
    }
    /* End of CODE A */

    /* CODE B */
    while ( h <= mid) {
        list[i] = final[h];
        i++; h++;
    }

    while ( j <= stop ) {
        list[i] = final[j];
        i++; j++;
    }
    /* End of CODE B */

    for (int k = start; k <= stop; k++) {
        list[k] = final[k];
        printArray(list, 4, "Intermediate Array: ");
    }
}

在任何时候,我都使用 CODE A 或 CODE B。当我使用 CODE A 时,函数会按预期执行。但是,当我使用 CODE B 时,该函数会用随机数据填充数组列表。

printArray 是一个自定义函数,用于打印数组、列表。在对一组数字 {4, 2, 6, 9} 进行排序时,我从 printArray 函数得到以下输出:

Intermediate Array: 2 2 6 9 <br>
Intermediate Array: 2 -790123182 6 9<br>
Intermediate Array: 2 -790123182 6 1968115546<br>
Intermediate Array: 2 -790123182 6 1968115546<br>
Intermediate Array: 2 -790123182 6 1968115546<br>
Intermediate Array: 2 -790123182 6 1968115546<br>
Intermediate Array: 2 -790123182 6 1968115546<br>
Intermediate Array: 2 -790123182 6 1968115546<br>

【问题讨论】:

    标签: c++ algorithm sorting mergesort


    【解决方案1】:

    在代码 B 中,从 list 到 final 的分配方向错误。试试这个:

    /* CODE B */
    while ( h <= mid) {
        final[i] = list[h];
        i++; h++;
    }
    
    while ( j <= stop ) {
        final[i] = list[j];
        i++; j++;
    }
    /* End of CODE B */
    

    【讨论】:

    • 感谢您抽出宝贵时间帮助我。它解决了我的问题。
    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多