C++ 使用C+合并排序+;程序没有得到正确的输出

C++ 使用C+合并排序+;程序没有得到正确的输出,c++,arrays,sorting,data-structures,mergesort,C++,Arrays,Sorting,Data Structures,Mergesort,我不知道这段代码出了什么问题,但我花了太多的时间来解决这个问题,但仍然无法解决。我认为复制数组时会出现一些错误,因为所有其他事情似乎都是正确的 请检查这个代码- #include<iostream> using namespace std; void MergeArray(int arr[],int lb,int mid,int ub){ int i=lb; int j=mid+1; int k=0; int newarr[ub-lb+1]; /

我不知道这段代码出了什么问题,但我花了太多的时间来解决这个问题,但仍然无法解决。我认为复制数组时会出现一些错误,因为所有其他事情似乎都是正确的

请检查这个代码-

#include<iostream>
using namespace std;


void MergeArray(int arr[],int lb,int mid,int ub){
    int i=lb;
    int j=mid+1;
    int k=0;
    int newarr[ub-lb+1];

//condition required for comparison between the split parts
    while(i<=mid && j<=ub){
        if(arr[i] < arr[j]){
            newarr[k]=arr[i];
            k++;
            i++;
        }
//basically a[j]<a[i] in this else condition
        else{
            newarr[k]=arr[j];
            k++;
            j++;
        }
    }
//all th left out elements in a[i] when a[j] is finished are added to newarr
    while(i<=mid){
        newarr[k]=arr[i];
        k++;
        i++;
    }
//all th left out elements in a[j] when a[i] is finished are added to newarr
    while(j<=ub){
        newarr[k]=arr[j];
        k++;
        j++;
    }

//copying all the elements of newarr to original arr
//i think this part has something messed up
   for(int i=lb;i<=ub;i=i+1){
        arr[i]= newarr[i];
    }

}


void MergeElements(int arr[], int lb,int ub){
    int mid;
    if(lb<ub){
        mid=(lb+ub)/2;
        //spliting into 2 arts**
        MergeElements(arr,lb,mid);
        MergeElements(arr,mid+1,ub);
        //merging in sorted order**
        MergeArray(arr,lb,mid,ub);
    }

}

int main(){
    int n;
    cout<<"enter the size of the array"<<endl;
    cin>>n;
    int arr[n];
    cout<<"please enter the elements of the array"<<endl;
    for(int i=0;i<n;i++){
        cout<<"enter the element no."<<i<<endl;
        cin>>arr[i];
    }

    MergeElements(arr,0,n-1);

    cout<<"\tSorted Array Elements"<<endl;
    for(int i=0;i<n;i++){
        cout<<arr[i]<<"\t";
    }
return 0;
}
#包括
使用名称空间std;
无效合并数组(整数arr[],整数lb,整数mid,整数ub){
int i=磅;
int j=mid+1;
int k=0;
国际新航空公司[ub lb+1];
//分割部件之间进行比较所需的条件

虽然(我好吧,我将绕过您在
C++
中使用可变长度数组(VLA)的问题(目前-VLA在标准
C++
中是不允许的),但首先,发布您的问题的解决方案。这是(正如您在评论中正确地“猜测”)在这个循环中:

//我觉得这部分有点不对劲

对于(int i=lb;i编写将数组newarr复制到arr-like中的循环

//copying all the elements of newarr to original arr
//i think this part has something messed up
   for(int i=lb, k = 0;i<=ub; i++, k++){
        arr[i]= newarr[k];
    }

此注释下面的循环

// copying all the elements of newarr to original arr

对源和目标使用相同的索引,但不应使用。要复制的
newarr[]
内容从索引
0
开始,而其目标区域位于
arr[]
从index
lb
开始,谢谢!现在代码运行良好,但根据我的理解,
lb
仅对数组
arr
为0,数组
newarr
有一些其他值,所以我需要从数组
中减去
lb
的值newarr
是否正确?@Sushant078
newarr
数组/向量是主数组的一个子数组,它的第一个元素从
0
开始!在给定的
arr
参数中,第一个元素(您使用的)的索引是
lb
。因此,当您复制回该数组时,元素
arr[lb]
应替换为子数组的第一个元素,即
newarr[0]
。类似地,
arr[lb+1]
将从
newarr[1]复制
,等等。后者的索引总是第一个的索引,减去
lb
偏移量。@Sushant078注意
j
k
的起始值-这是做同样的事情。相关:
// copying all the elements of newarr to original arr