我正在尝试通过递归进行代码合并排序。但是我没有得到正确排序的输出。请更正我的代码,并告诉我有关错误的详细信息。
该程序从用户那里获取元素和元素的数量。根据数据,程序应按排序顺序给出元素。
代码如下。
#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("%d\t",data[i]);
}
cout<<endl;
merge_sort(0,n+1);
cout<<"The sorted list is: "<<endl;
for(int i=0; i<n; i++){
printf("%d\t",data[i]);
}
return 0;
}
最佳答案
您的代码与this文章中的代码不同,正如您在注释中所写。关键区别在于合并功能。
如果仔细检查代码,您会发现代码的某些部分可能会更改数据数组,而不保存其当前状态。例如:
while(i <= mid){
data[k] = nw[i];
k++;
i++;
}
在具有约4个元素的数组上尝试一下,例如5,6,4,2,您会注意到一些原始数组成员不会出现在输出数组中。
您没有提供有关您的开发环境的信息,但是其中大多数都内置了调试器。试用一下调试器,您最终将解决问题。或重新阅读文章并再次对算法进行编码。
祝你好运。
(此外,将来,请尝试对问题标题进行更具体的说明,并尝试提供有关该问题的其他信息,例如一些示例。这里的人希望提供帮助,但并不是每个人都有足够的时间阅读问题并进行编译,或调试您的代码。如果您更具体,可能有人会通过阅读您的问题来知道答案,而无需进行进一步调查)
关于c++ - 合并排序输出问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28644886/