我的合并排序算法没有得到正确的答案

时间:2016-10-17 04:27:55

标签: c++ algorithm sorting mergesort

我是C ++和算法的新手。我对我编写的Merge Sort算法感到困惑。我不知道为什么代码没有错误时没有得到正确的答案。在代码中,我想排序我输入的5个数字。但排序的数组不会在屏幕上打印。我想知道我的代码中的问题。非常感谢。

#include<iostream>
using namespace std;
int merge(int a[], int low, int mid, int high) {
    int h = low; int j = mid + 1; int k = low;
    int *b = new int[high - low + 1];
    while ((h <= mid) && (j <= high)) {
        if (a[h] < a[j])
            b[k++] = a[h++];
        else
            b[k++] = a[j++];

    }
    if (h > mid) {
        for (j; j <= high;++j)
            b[k++]=a[j];
    }
    if (j > high) {
        for (h; h <= mid; ++h)
            b[k++] = a[h];
    }
    for (int i = low; i <= high; ++i)
        a[i] = b[i];
    delete []b;
    return 0;
}
int MergeSort(int a[], int low, int high) {
    if (low < high) {
        int mid = (low + high) / 2;
        MergeSort(a, low, mid);
        MergeSort(a, mid + 1, high);
        merge(a, low, mid, high);
    }
    return 0;
}

int main() {
    int const n(5);
    int a[n];
    cout << "Input " << n << " numbers please:";
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    MergeSort(a, 0, n - 1);
    for (int i = 0; i <= n - 1; ++i)
        cout << a[i] << " ";
    cout << endl;
}

2 个答案:

答案 0 :(得分:1)

MergeSort函数 - 假设low + 1 == high mid==low

MergeSort(a, low, mid)的递归调用将立即返回,而MergeSort(a, mid, high)将再次传递相同的lowhigh - 直到您的应用程序将溢出堆栈(并且您&# 39;再次发布关于SO的问题?)

merge功能,假设为low==3mid==4high==5

您分配b[] 3。到目前为止一切都很好。

但是你开始使用k=low(这是3)并执行b[k++]的分配 - 当你在{{{{}}写作时,在接下来的步骤中已经超出范围了1}}和b[4]b[5]b[0]将保持不变。)

依此类推(包括b[1]

您可能要做的是在for (int i = low; i <= high; ++i) a[i]=b[i];周期结束时执行- low偏移b[k-low]后跟k++的临时存储的所有分配)。

答案 1 :(得分:0)

我发现只是一个小问题。试试这个简单的修复。

for (int i = 0; i <= n - 1; ++i) {
        cout << a[i] << " ";
        cout << endl;
   }

您的代码缺少for语句中的括号。 此代码可以在我的计算机上使用此修复程序。