问题描述
#include<iostream>
using namespace std;
void merge(int* arr,int l,int mid,int r)
{
int n1=mid-l+1;
int n2=r-mid;
int L[n1],R[n2];
for(int i=0; i<n1; i++)
L[i]=arr[l+i];
for(int i=0; i<n2; i++)
R[i]=arr[mid+1+i];
int i=0,j=0,k=l;
while(i<n1 && j<n2){
if(L[i]<=R[j])
arr[k++]=L[i++];
else
arr[k++]=R[j++];
}
while(i<n1)
arr[k++]=L[i++];
while(j<n2)
arr[k++]=R[j++];
}
void mergesort(int* arr,int r)
{
if(l<r){
int mid=(l+r)/2;
printf("MS(%d,%d)\n",l,r);
mergesort(arr,mid);
printf("MS(%d,mid+1,r);
printf("MS(%d,r);
merge(arr,mid,r);
printf("Afte Merge: MS(%d,r);
}
}
int main()
{
int arr[] = {5,2,1,6,7,9,4};
mergesort(arr,6);
for(auto x:arr)
cout<<x<<' ';
return 0;
}
我正在打印l和r的值,以在每次递归调用时检查它们的值。但这并不完全正确。首次合并后的一个示例是:-
OUTPUT:
MS(0,6)
MS(0,3)
MS(0,1)
MS(0,1)
Afte Merge: MS(0,1)
第4行和第5行(从1开始为MS(0,6))应分别打印MS(0,0)和MS(1,1)。请告诉我我在做什么错我想要正确的输出。
问候
解决方法
由于l == r,因此无法打印MS(0,0)。
如果使用if(l
因此,您的代码是准确的。
if(l<r){
int mid= l + (r-l)/2;
printf("MS(%d,%d)\n",l,r);
mergesort(arr,mid);
printf("MS(%d,mid+1,r);
printf("MS(%d,r);
merge(arr,mid,r);
printf("Afte Merge: MS(%d,r);
}