【问题标题】:I'm getting a runtime error in this merge sort algorithm code我在此合并排序算法代码中遇到运行时错误
【发布时间】:2020-07-24 19:07:21
【问题描述】:

我在这段代码中遇到了运行时错误。此代码用于合并排序算法。如何找到错误?

此代码使用递归和函数。递归调用函数mergesort对数组进行划分,直到其大小减小到1。然后使用merge函数合并多个数组。

 #include <iostream>
    using namespace std;
    void merge(int l[],int size1,int r[],int size2,int input[],int size){
        int i=0,j=0,k=0;
        while(i<size1 && j<size2){
            if(l[i]<=r[j]){
                input[k]=l[i];
                k++;
                i++;
            }
            else{
                input[k]=r[j];
                j++;
            }
            k++;
        }
        while(i<size1){
            input[k]=l[i];
            i++;
            k++;
        }
        while (j<size2){
            input[k]=r[j];
            j++;
            k++;
        }
    }
    void mergesort(int input[],int size){
        if(size<2){
            return;
        }
        int mid= size/2;
        int l[500];
        int r[500];
        for(int i=0;i<mid-1;i++){
            l[i]=input[i];
        }
        for(int j=mid;j<size-1;j++){
            r[j-mid]=input[j];
        }
        mergesort(l,mid);
        mergesort(r,size-mid);
        merge(l,mid,r,size-mid,input,size);
    
    
    }
    
    int main() {
        int n;
        cin>>n;
        int arr[1000];
        for(int i=0;i<n;i++){
            cin>>arr[i];
        }
        mergesort(arr,n);
        for(int j=0;j<n;j++){
            cout<<arr[j]<<" ";
        }
    
    
        return 0;
    }

【问题讨论】:

  • 您提供的输入是什么?考虑在调试器中运行代码,以便查看发生了什么。
  • 我猜for(int i=0;i&lt;mid-1;i++)应该是for(int i=0;i&lt;mid;i++)
  • @RSahu 与for(int j=mid;j&lt;size-1;j++){ 相同。这至少复制了所有数据,但结果仍然不正确。我停在那里。
  • @RetiredNinja,真的。

标签: c++11 recursion c++14 c++17 mergesort


【解决方案1】:

我在您的代码中看到以下错误。

  1. for(int i=0;i&lt;mid-1;i++) 必须是for(int i=0;i&lt;mid;i++)

  2. for(int j=mid;j&lt;size-1;j++) 必须是for(int j=mid;j&lt;size;j++)

  3. 您在merge 中错误地递增k

    循环

    while(i<size1 && j<size2){
       if(l[i]<=r[j]){
          input[k]=l[i];
          k++;
          i++;
       }
       else{
          input[k]=r[j];
          j++;
       }
       k++;
    }
    

    需要

    while(i<size1 && j<size2){
       if(l[i]<=r[j]){
          input[k]=l[i];
          //  k++; This is an error.
          i++;
       }
       else{
          input[k]=r[j];
          j++;
       }
       k++;
    }
    

【讨论】:

    猜你喜欢
    • 2022-06-30
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 2020-09-05
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    相关资源
    最近更新 更多