Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 合并排序| C和#x2B+;-分段故障_C++_Sorting_Mergesort - Fatal编程技术网

C++ 合并排序| C和#x2B+;-分段故障

C++ 合并排序| C和#x2B+;-分段故障,c++,sorting,mergesort,C++,Sorting,Mergesort,我想我应该通过编写一些基本的DS和Algos来修改我的概念。在一个伟大的步伐后,我现在有点卡住了,无法识别我的错误。 我在下面的代码结果中得到一个分段错误。任何帮助都会很好 #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;

我想我应该通过编写一些基本的DS和Algos来修改我的概念。在一个伟大的步伐后,我现在有点卡住了,无法识别我的错误。 我在下面的代码结果中得到一个分段错误。任何帮助都会很好

#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;
}
#包括
使用名称空间std;
无效合并(int*arr,int s,int m,int e){
int n1=m-s,n2=e-m+1;
int L[n1],R[n2];

对于(int i=0;i而言,分段错误是因为您有一个无限递归循环。索引和一个拼写错误存在一些问题,您的意思是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;
}
#包括
使用名称空间std;
无效合并(int*arr,int s,int m,int e){
int n1=m-s+1,n2=e-m;
int L[n1],R[n2];

对于(int i=0;最好的帮助是调试器,它会精确地指出故障发生的位置,此时您将能够检查所有变量的值。我恐怕无法阅读您的代码,因为我根本不知道这些一个字母的变量的含义。建议阅读:…而且实际上更容易避免如果您坚持传统的半开间隔,则会出现一个错误。@TedLyngmo向右看。