【问题标题】:I can't get my MergeSort implementation to run我无法让我的 MergeSort 实现运行
【发布时间】:2020-09-30 12:30:31
【问题描述】:

我在让我的归并排序算法工作时遇到问题。第一个问题是我的数组没有被创建,因为我无法动态创建一个数组(它必须是一个常量值)。我通过创建非常大的数组跳过了这一点,但现在输出仍然非常混乱。任何帮助将不胜感激。

#include <iostream>
#include <string>
#include <iomanip>
#include <cstdlib>
#include <time.h>
#include <fstream>

using namespace std;
void MergeSort(int[], int, int);
void Merge(int[], int, int, int);

int main()
{
    int A[] = {5,3,2,6,7,8,1,9};

    MergeSort(A, 0, 7);

    for (int i = 0; i < 7; i++) {
        cout << A[i] << " ";
    }
}


void Merge(int A[], int f, int m, int l) {
    int i, j, k;
    int n = l - m + 1;
    int temp[500];
    int lefttemp[9];
    int righttemp[9];

    k = 0;

    for (i = 0; i < m;  i++) {
        lefttemp[i] = A[i];
    }
    for (j = m + 1; j < l;  j++) {
        righttemp[k] = A[j];
    }
    for (int m = 0; m < 7; m++) {
        cout << "position" << lefttemp[m] << " booga";
    }
    for (int n = 0; n < 7; n++) {
        cout << righttemp[n] << " ";
    }
    i = 0;
    j = 0;
    k = 0;
    while (i < m && j < l) {

        if (lefttemp[i] < righttemp[j]) {
            temp[k] = lefttemp[i];
            k++;
            i++;
            cout << temp[k];
        }
        else {
            temp[k] = righttemp[j];
            k++;
            j++;
            cout << temp[k];
        }
    }
    if (i < m) {
        while (i < m) {
            temp[k] = lefttemp[i];
            i++;
            k++;
        }
        if (j < l) {
            while (j <= l) {
                temp[k] = righttemp[j];
                j++;
                k++;
            }

        }

    }

}
void MergeSort(int A[], int beginning, int end) {
    int midpoint;
    if (beginning>=end) {
        return;
    }
    else {
        int f = beginning;

        int l = end;
        cout << l << endl;
        midpoint = (beginning + end) / 2;
        MergeSort(A, f, midpoint);
        MergeSort(A, midpoint + 1, l);
        Merge(A, f, midpoint, l);


    }
}

编辑:刚刚想通了

#include <iostream>
#include <string>
#include <iomanip>
#include <cstdlib>
#include <time.h>
#include <fstream>

using namespace std;
void MergeSort(int[], int, int);
void Merge(int[], int, int, int);

int main()
{
    int A[] = {5,3,2,6,7,8,1,9};
    for (int i = 0; i < 8; i++) {
        cout << A[i] << " ";
    }
    cout<<endl;
    MergeSort(A, 0, 7);

    for (int i = 0; i < 8; i++) {
        cout << A[i] << " ";
    }
}


void Merge(int A[], int f, int m, int l) {
    int i, j, k, z;
    int n = l - m + 1;
    int* temp;
    int lengthtemp = l-f+1;
    temp = new int[lengthtemp];
    int* lefttemp;
    int* righttemp;
    righttemp = new int[l-m];
    lefttemp = new int[m-f+1];
    cout << "The length is " << lengthtemp << endl;
    k = 0;
    z = 0;

    for (i = f; i <= m;  i++) {
        lefttemp[z] = A[i];
        z++;
    }
    for (j = m+1 ; j <= l;  j++) {
        righttemp[k] = A[j];
        k++;
    }

    i = 0;
    j = 0;
    k = 0;
    int leftsize, rightsize;
    leftsize = m+1 - f;
    rightsize = l - m;
    while (i < leftsize && j < rightsize)
    {

        if (lefttemp[i] < righttemp[j])
        {
            temp[k] = lefttemp[i];
            i++;
            k++;
        }
        else 
        {
            temp[k] = righttemp[j];
            j++;
            k++;
        }
    }
    if (i < leftsize) {
        while (i < leftsize) {
            temp[k] = lefttemp[i];
            i++;
            k++;
        }
    }
        if (j < rightsize) {
            while (j < rightsize) {
                temp[k] = righttemp[j];
                j++;
                k++;
            }

        }
        int randomstart = 0;
        for (i = f; i <= l; i++) {
            A[i] = temp[randomstart];
            randomstart++;
        }
        delete[] temp;
        delete[] righttemp;
        delete[] lefttemp;



}
void MergeSort(int A[], int beginning, int end) {
    int midpoint;
    if (beginning>=end) {
        return;
    }
    else {
        int f = beginning;

        int l = end;

        midpoint = (beginning + end) / 2;
        MergeSort(A, f, midpoint);
        MergeSort(A, midpoint + 1, l);
        Merge(A, f, midpoint, l);


    }
}

【问题讨论】:

  • 使用std::vector 代替数组
  • 当它工作时获得评论:codereview.stackexchange.com
  • righttemp[k] = A[j]; 跳出来冲我。 k 没有移动,所以这个循环总是写到同一个地方。如果这是故意的,则不需要循环。如果这不是故意的,那就是错误的定义。而且因为停在那里是我试图训练自己摆脱的那种混蛋,你的意思是righttemp[k++] = A[j];
  • 建议:不要将问题更改为包含答案,而是在答案中回答问题。它更适合网站的流程,未来的提问者可以看到问题有答案。还要让 Martin York 参与代码审查。让人们挑选您的代码可能有点自负,但它总是具有教育意义。

标签: c++ algorithm sorting data-structures


【解决方案1】:

这是代码的答案:

#include <iostream>
#include <string>
#include <iomanip>
#include <cstdlib>
#include <time.h>
#include <fstream>

using namespace std;
void MergeSort(int[], int, int);
void Merge(int[], int, int, int);

int main()
{
    int A[] = {5,3,2,6,7,8,1,9};
    for (int i = 0; i < 8; i++) {
        cout << A[i] << " ";
    }
    cout<<endl;
    MergeSort(A, 0, 7);

    for (int i = 0; i < 8; i++) {
        cout << A[i] << " ";
    }
}


void Merge(int A[], int f, int m, int l) {
    int i, j, k, z;
    int n = l - m + 1;
    int* temp;
    int lengthtemp = l-f+1;
    temp = new int[lengthtemp];
    int* lefttemp;
    int* righttemp;
    righttemp = new int[l-m];
    lefttemp = new int[m-f+1];
    cout << "The length is " << lengthtemp << endl;
    k = 0;
    z = 0;

    for (i = f; i <= m;  i++) {
        lefttemp[z] = A[i];
        z++;
    }
    for (j = m+1 ; j <= l;  j++) {
        righttemp[k] = A[j];
        k++;
    }

    i = 0;
    j = 0;
    k = 0;
    int leftsize, rightsize;
    leftsize = m+1 - f;
    rightsize = l - m;
    while (i < leftsize && j < rightsize)
    {

        if (lefttemp[i] < righttemp[j])
        {
            temp[k] = lefttemp[i];
            i++;
            k++;
        }
        else 
        {
            temp[k] = righttemp[j];
            j++;
            k++;
        }
    }
    if (i < leftsize) {
        while (i < leftsize) {
            temp[k] = lefttemp[i];
            i++;
            k++;
        }
    }
        if (j < rightsize) {
            while (j < rightsize) {
                temp[k] = righttemp[j];
                j++;
                k++;
            }

        }
        int randomstart = 0;
        for (i = f; i <= l; i++) {
            A[i] = temp[randomstart];
            randomstart++;
        }
        delete[] temp;
        delete[] righttemp;
        delete[] lefttemp;



}
void MergeSort(int A[], int beginning, int end) {
    int midpoint;
    if (beginning>=end) {
        return;
    }
    else {
        int f = beginning;

        int l = end;

        midpoint = (beginning + end) / 2;
        MergeSort(A, f, midpoint);
        MergeSort(A, midpoint + 1, l);
        Merge(A, f, midpoint, l);


    }
}

【讨论】:

    猜你喜欢
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多