【问题标题】:Merge Sort using C++ Program not getting correct output使用 C++ 程序合并排序没有得到正确的输出
【发布时间】:2020-06-09 05:30:57
【问题描述】:

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

请检查此代码-

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

我认为我无法正确获取数组,因为我认为其他所有内容似乎都是正确的,请检查

【问题讨论】:

标签: c++ arrays sorting data-structures mergesort


【解决方案1】:

好吧,我将绕过您在C++ 中使用可变长度数组 (VLA) 时遇到的问题(目前 - 标准中不允许 VLA /em> C++),首先,发布您的问题的解决方案。这是(正如你在你的 cmets 中正确“猜到”的那样)在这个循环中:

//i think this part has something messed up
   for(int i=lb;i<=ub;i=i+1){
        arr[i]= newarr[i];
    }

这里,虽然i 索引(从给定的下限lb 开始)对于arr 数组是正确的,但对于newarr 数组是正确的!这是在本地创建的,大小为ub - lb + 1(正确),但索引从零开始 - 所以您需要删除newarrlb 偏移量:

   for (i = lb; i <= ub; i++) { // NOTE: You've already declared "int i" - a new one will give a 'hides previous declaration' warning
        arr[i] = newarr[i - lb]; // *** You need to remove the lower-bound offset!
    }

关于C++ 中的VLA 问题:我相信GCC/g++ 支持这些,但是,如果你想遵守标准 C++,你应该使用std::vector。所以,代替:

int newarr[ub - lb + 1];

使用:

std::vector<int> newarr(size_t(ub - lb + 1));

同样在你的main 函数中使用std::vector&lt;int&gt; arr(n);。对于代码的最小 更改,您仍然可以保留您的void MergeElements(int arr[], int lb, int ub) 签名,但是要使用std::vector 调用它,您需要提供第一个元素的地址。所以,在main 中使用这个:

MergeElements(&arr[0], 0, n - 1);

请随时要求进一步澄清和/或解释。

【讨论】:

  • 谢谢!现在代码工作正常,但我仍然不理解 lb 部分,根据我的理解 - lb 仅适用于数组 arr 0 并且数组 newarr 有一些其他值所以我需要减去数组newarrlb 的值正确吗?
  • @Sushant078 newarr 数组/向量是主数组的一个子数组,它的第一个元素从0 开始!在给定的arr 参数中,第一个元素(您使用的)将lb 作为其索引。因此,当您复制回该数组时,应将元素 arr[lb] 替换为子数组的 first 元素,即 newarr[0]。同样,arr[lb+1] 将从newarr[1] 复制,依此类推。后者的索引始终是第一个减去lb 偏移量的索引。
  • @Sushant078 注意jk 的起始值 - 这是做同样的事情。
【解决方案2】:

编写将数组 newarr 复制到 arr 中的循环

//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];
    }

请注意,可变长度数组不是标准 C++ 功能。您可以使用标准容器std::vector&lt;int&gt;,而不是可变长度数组newarr。还使用标准算法使 functionMergeArray 的实现更加简单。你来了

void MergeArray(int arr[],int lb,int mid,int ub){
    std::vector<int> newarr(ub-lb+1 );

    std::merge( arr + lb, arr + mid + 1, arr + mid + 1, arr + ub + 1, newarr.begin() );
    std::copy( newarr.begin(), newarr.end(), arr + lb );
}

【讨论】:

    【解决方案3】:

    此评论下方的循环

    // copying all the elements of newarr to original arr
    

    对源和目标使用相同的索引——它不应该。要复制的newarr[] 内容从索引0 开始,而arr[] 中的目标区域从索引lb 开始。

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2022-06-10
      • 2017-08-18
      • 2023-03-28
      相关资源
      最近更新 更多