【问题标题】:Merge sort algorithm is not functioning properly合并排序算法无法正常运行
【发布时间】:2020-12-07 16:14:30
【问题描述】:

合并排序算法没有按预期工作。输出值未按升序完全排序。一些值是乱序的,这指向了一个错误。

#include <stdio.h>
#include <stdlib.h>

void merge(int *L, int *R, int *a, int nL, int nR) {
    int i, j, k;
    i = j = k = 0;

    while ((i < nL) && (j < nL)) {
        if (L[i] < R[j]) {
            a[k] = L[i];
            ++i;
        } else {
            a[k] = R[j];
            ++j;
        }
        ++k;
    }

    while (i < nL) {
        a[k] = L[i];
        ++i;
        ++k;
    }

    while (j < nR) {
        a[k] = R[j];
        ++j;
        ++k;
    }
}

void mergeSort(int *a, int n) {
    if (n < 2)
        return;

    int i, mid, *L, *R;

    mid = n / 2;

    L = (int *)malloc(mid * sizeof(int));
    R = (int *)malloc((n - mid) * sizeof(int));

    for (i = 0; i < mid; ++i) {
        L[i] = a[i];
    }

    for (i = mid; i < n; ++i) {
        R[i - mid] = a[i];
    }

    mergeSort(L, mid);
    mergeSort(R, n - mid);

    merge(L, R, a, mid, n - mid);

    free(L);
    free(R);
}

int main() {
    int i, n, *a;

    scanf("%d", &n);

    a = (int *)malloc(n * sizeof(int));

    for (i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }

    mergeSort(a, n);

    for (i = 0; i < n; ++i) {
        printf("%d ", a[i]);
    }

    free(a);

    return 0;
}

例如,对于以下输入:10 10 9 8 7 6 5 4 3 2 1

我应该得到这些输出:1 2 3 4 5 6 7 8 9 10

但是输出不是按升序排列的。输出为:1 3 4 5 2 6 8 9 10 7

【问题讨论】:

  • 归并排序算法不涉及对malloc()free()的任何调用建议阅读:mergesort algorithm
  • 关于:我应该得到这些输出:1 2 3 4 5 6 7 8 9 10 合并排序算法不会删除重复项,所以输出应该是:1 2 3 4 5 6 7 8 9 10 10

标签: c sorting merge mergesort divide-and-conquer


【解决方案1】:

不确定它是否涵盖了所有问题,但是

while((i < nL) && (j < nL))

应该是

while((i < nL) && (j < nR))
                        ^
                        note

【讨论】:

  • 光看是不够的。您需要调试、跟踪、尝试各种用例。您需要将代码分成几部分并重新组合在一起。
  • 感谢您的建议
猜你喜欢
  • 2015-09-23
  • 2023-03-22
  • 2013-09-17
  • 1970-01-01
  • 2020-08-03
  • 2015-12-10
  • 2018-04-13
  • 2014-05-20
  • 1970-01-01
相关资源
最近更新 更多