【问题标题】:mergesort in c++:segmentation faultC ++中的合并排序:分段错误
【发布时间】:2016-07-20 14:46:49
【问题描述】:

我在实现合并排序时遇到分段错误。 我已经检查了数组是否越界。我希望得到一些帮助来找出我哪里出错了。我已经尝试了小数组的输入,例如大小为 10 的数组,其中我将 temp 的大小设为静态(>10)。我已经把我的头发拉了好几个小时了。

更新:我只需要更改 mid=(low+high)/2。

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

void merges(int arr[],int low,int mid,int high)
{
    int i=low,j=mid+1,k=0;
    int temp[high-low+1];
    while(i<=mid && j<=high)
    {
           if(arr[i]<arr[j])
            {
                temp[k++]=arr[i];
                i++;
            }
            else
            {
                temp[k++]=arr[j];
                j++;               
            }
    }
    if(i>mid)
    {
        while(j<=high)
        {
            temp[k++]=arr[j];
            j++;
        }
    }
    else
    {
        while(i<=mid)
        {
            temp[k++]=arr[i];
            i++;
        }
    }
    j=0;
    for(i=low;i<=high;i++)
    {
        arr[i]=temp[j++];    
    }
}

void mergesort(int arr[],int low,int high)
{
    if(low<high)
    {
    int mid=low+high/2;
    mergesort(arr,low,mid);
    mergesort(arr,mid+1,high);
    merges(arr,low,mid,high);
    }   
}

int main(){
    int n;
    cin >> n;
    int arr[n];
    for(int arr_i = 0;arr_i < n;arr_i++){
    cin >> arr[arr_i];
    }
    int i,j,k;
    mergesort(arr,0,n-1);
    for(i=0;i<n;i++)
        cout<<arr[i];
    return 0;
}

【问题讨论】:

  • 当你在调试器下遇到分段错误时,它应该指出它发生的位置。您不是在调试器下运行它还是对我们隐藏了这些信息?
  • 尝试将 mid 更改为 (low + high) / 2 而不是 low + high / 2
  • 建议 - 让 midhigh 指向 last 后面的元素,就像标准 C++ 算法一样。首先这将使您的代码更清晰,其次您可以轻松使用标准算法(例如std::copy 而不是循环)。在 C++ 中这样做是有原因的。
  • 注意:可变大小数组在c++中是非法的,即使gcc编译了它
  • 您遇到了堆栈溢出异常,这意味着您一遍又一遍地调用mergesort 函数,直到堆栈耗尽。为什么你在调试的时候没有意识到这一点?至少,您可以打印出函数中的值以用于调试目的,并且看到您将拥有无穷无尽的数量。

标签: c++ mergesort


【解决方案1】:

我只需要更改 mid=(low+high)/2。谢谢@Gerado Gálvez 的建议

【讨论】:

    【解决方案2】:

    您正在递归调用合并排序。尽管您的一般情况似乎合法,但我无法确定您的基本情况(即退出递归)。

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2021-03-24
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多