简体   繁体   English

合并排序 | C++ - 分段错误

[英]Merge Sort | C++ - Segmentation Fault

I thought I'd revise my concepts by coding some basic DS and Algos.我想我会通过编写一些基本的 DS 和算法来修改我的概念。 After a great pace, I am kinda stuck now and not being able to identify my mistake.经过一个很大的步伐,我现在有点卡住了,无法识别我的错误。 I am getting a Segmentation Fault in the below code result.我在以下代码结果中收到分段错误。 Any help would be great!任何帮助都会很棒!

#include<bits/stdc++.h>
using namespace std;

void merge(int *arr, int s, int m, int e){
    int n1 = m-s, n2 = e-m+1;
    int L[n1], R[n2];
    for(int i=0; i<n1; i++)
        L[i] = arr[s+i];
    for(int i=0; i<n2; i++)
        R[i] = arr[m+i];
    
    int p1 = 0, p2 = 0, k = s;
    while(p1<n1 && p2<n1){
        if(L[p1] <= R[p2])
            arr[k++] = L[p1++];
        else
            arr[k++] = R[p2++];
    }

    while(p1<n1)
        arr[k++] = L[p1++];
    while(p2<n2)
        arr[k++] = R[p2++];
    return;
}


void mergeSort(int *arr, int s, int e){
    if(s>=e) return;
    int m = (s+e)/2;
    mergeSort(arr, s, m-1);
    mergeSort(arr, m, e);
    merge(arr, s, m, e);
    return;
}
int main(){
    int n;
    cin>>n;
    int arr[n];
    for(int i=0; i<n; i++)
        cin>>arr[i];
    mergeSort(arr, 0, n-1);

    for(int i=0; i<n; i++)
        cout<<arr[i]<<" ";
    cout<<endl;

    return 0;
}

Thanks in advance!提前致谢!

The segmentation error is because you have an infinite recursion loop.分段错误是因为您有一个无限递归循环。 There were some problems with the indices and one typo where you meant n2 but wrote n1.索引有一些问题,还有一个拼写错误,你的意思是 n2 但写的是 n1。

#include <iostream>

using namespace std;

void merge(int *arr, int s, int m, int e){
    int n1 = m-s+1, n2 = e-m;
    int L[n1], R[n2];

    for(int i=0; i<n1; i++)
        L[i] = arr[s+i];
    for(int i=0; i<n2; i++)
        R[i] = arr[m+i+1];

    int p1 = 0, p2 = 0, k = s;
    while(p1<n1 && p2<n2){
        if(L[p1] <= R[p2])
            arr[k++] = L[p1++];
        else
            arr[k++] = R[p2++];
    }

    while(p1<n1)
        arr[k++] = L[p1++];
    while(p2<n2)
        arr[k++] = R[p2++];
    return;
}

void mergeSort(int *arr, int s, int e){
    if(s>=e) return;
    int m = (s+e)/2;
    mergeSort(arr, s, m);
    mergeSort(arr, m+1, e);
    merge(arr, s, m, e);
    return;
}

int main() {
    int n;

    cout << "Select value for N:";
    cin>>n;
    int arr[n];

    cout << "Reading input:";
    for(int i=0; i<n; i++)
        cin >> arr[i];

    cout << "Your input is:" << endl;
    for(int i=0; i<n; i++)
        cout << arr[i]<<" ";
    cout << endl;

    cout << "Running merge sort" << endl;
    mergeSort(arr, 0, n-1);

    cout << "Final array:" << endl;
    for(int i=0; i<n; i++)
        cout<<arr[i]<<" ";
    cout << endl;

    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM