在mergesort递归中打印错误的索引值

问题描述

#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);
    }