合并排序输出问题

Merge sort output issue

本文关键字:出问题 输出 排序 合并      更新时间:2023-10-16

我正试图通过递归对合并排序进行编码。然而,我没有按正确的排序顺序得到输出。请更正我的代码,并告诉我有关错误的详细信息。程序从用户那里获取元素和元素的数量。根据数据,程序应该按排序顺序给出元素。代码如下。

#include <iostream>
#include <cstdio>
#define max 20
using namespace std;
int data[max];
int nw[max];
void mergeparts(int, int, int);

void merge_sort(int low, int high){
    int mid;
    if(low<high){
        mid=(low+high)/2;
        merge_sort(low, mid);
        merge_sort(mid+1, high);
        mergeparts(low, mid, high);
    }
}
void mergeparts(int low, int mid, int high){
    for(int i=low; i<high; i++){
        nw[i] = data[i];
    }
    int i = low;
    int j = mid+1;
    int k = low;

    while((i <= mid)&&(j <= high)){
        if(nw[i]<=nw[j]){
            data[k]=nw[i];
            i++;
        }
        else{
            data[k]=nw[j];
            j++;
        }
        k++;
    }
    while(i <= mid){
        data[k] = nw[i];
        k++;
        i++;
    }
    while(j <= high){
        data[k] = nw[j];
        k++;
        j++;
    }
    for(int i=low; i<high; i++){
        data[i] = nw[i];
    }
}
int main(){
    int n;
    cout<<"Enter the number of elements"<<endl;
    cin>>n;

    cout<<"Enter the "<<n<<" numbers."<<endl;
    for(int i=0; i<n; i++){
        cin>>data[i];
    }
    cout<<"The unsorted list is: "<<endl;
    for(int i=0; i<n; i++){
        printf("%dt",data[i]);
    }
    cout<<endl;
    merge_sort(0,n+1);
    cout<<"The sorted list is: "<<endl;
        for(int i=0; i<n; i++){
            printf("%dt",data[i]);
    }
    return 0;
}

正如您在评论中所写的,您的代码与本文中的代码不同。关键区别在于合并功能。

如果你仔细检查你的代码,你会注意到你的代码中有一些部分可能会改变数据数组,而不会保存它的当前状态;例如:

 while(i <= mid){
        data[k] = nw[i];
        k++;
        i++;
    }

在一个有4个元素的数组上试用它,例如5、6、4、2,你会注意到一些原始数组成员不会出现在输出数组中。

您没有提供有关开发环境的信息,但大多数开发环境都内置了调试器。使用调试器,您最终会解决问题。或者重读这篇文章,重新编写算法代码。

祝你好运。

(此外,在未来,试着对问题标题更具体一点,并试着提供一些关于问题的额外信息,比如一些例子。这里的人希望提供帮助,但并不是每个人都有足够的时间阅读问题、编译或调试代码。如果你更具体,可能有人只需阅读你的问题就知道答案,而无需进一步调查)