当前位置: 首页 > 知识库问答 >
问题:

C中的Mergesort:分段错误

陈志
2023-03-14

我在实现合并排序时遇到了分段错误。我已经检查了数组是否超出边界。我想得到一些帮助,找出我哪里出了问题。我尝试过小数组的输入,例如大小为10的数组,我将temp的大小作为静态值(

更新:我只需要改变mid=(低高)/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;
}

共有2个答案

湛宝
2023-03-14

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

夏侯野
2023-03-14

我只需要改中=(低高)/2谢谢@Gerado Gálvez的建议

 类似资料:
  • 问题内容: 我想我首先要说的是,我刚刚在我的电脑中安装了linux(debian),并且对在linux中做事的知识只有零。这个问题可能是由于一些非常简单的事情造成的。 代码的相关部分与此类似: 这应该打印文件“ names.txt”的第一行。而是打印一个空行。当我尝试将snline用作另一个函数的输入时,出现错误“ Segmentation Fault”。我应该如何修改我的代码来做到这一点?在Li

  • 我目前正在哈佛大学做CS50,目标是以最快的方式将字典加载到任何数据结构中。对于这个习题集,我用的是trie。 我的代码背后的逻辑如下: null 但问题是,它在我的其他一些实现中有效,只有在这个实现中,它突然停止工作,并在第一个单词后给了我一个切分错误。正如我所说,我是一个初学者在编码,所以请启发我和批评我的实现!多谢了。 编辑: 我的另一个问题是,为什么在我当前的代码中,它不能检测空终止符\0

  • 本文向大家介绍C / C ++中出现分段错误的常见原因列表,包括了C / C ++中出现分段错误的常见原因列表的使用技巧和注意事项,需要的朋友参考一下 分段错误的主要原因是访问未初始化的内存,程序超出范围或试图修改字符串文字。尽管不能保证它们会导致分段错误,但这些可能会导致分段错误。这是分段错误的一些常见原因- 超出范围访问数组 解引用NULL指针 取消引用释放的内存 取消引用未初始化的指针 错误

  • 我解决了一个黑客等级的问题。 编辑 感谢@John的回答。下面是没有seg故障的情况:

  • 我有一个家庭作业要写“先到先得”和“循环模拟”并比较它们。我开始创建一个链表来制作事件列表。我制作了插入和打印列表函数,但无法使其工作。我的朋友告诉我使用双链表,所以我重新创建了链表,并试图使插入函数工作。我修复了大部分问题,但现在找不到插入函数的错误。当我比较是否插入指针数据和当前指针数据时,While循环语句出现分段错误。我已经阅读了我的C语言书,书中的代码与我的代码相似,并且还通过了双链表分

  • 我正在C中实现合并排序。我有一个合并函数-和一个mergeSort函数-。 如果对原始数组的前半部分和后半部分进行排序(例如:),则合并排序可以很好地工作。这是因为我的merge函数无论在什么情况下都要传递原始数组,并且当它被赋予2个排序数组时(正如预期的那样),它可以工作。我的问题是他们什么时候不是。每次调用merge时,我的原始数组都没有被修改,尽管我已经对它进行了编程。有人能知道我的问题在哪