2016-07-18 14 views
-5

Ich habe für ziemlich lange programmiert. Aber ich weiß nicht viel über Algorithmen. Jetzt habe ich beschlossen, einige Algorithmen zu lernen. Ich lerne Merge-Sort. Ich lerne aus dem Coreman-Buch. Dies ist der Code, den ich geschrieben habe.Ich bekomme Segmentierung Fehler für Merge-Sort

#include <iostream> 
#include <cstdio> 

using namespace std; 

int infinity = 1000; 

void merge_sort(int A[],int p, int r); 
void merge(int A[], int p, int q, int r); 

int main() 
{ 
    freopen("input.txt", "r", stdin); 
    freopen("output.txt", "w", stdout); 
    int n; 
    cin >> n; 
    int A[n]; 
    for(int i=0; i<n; ++i) 
    { 
    cin >> A[i]; 
    } 
    merge_sort(A,0,n); 
    for(int i=0; i<n; ++i) 
    { 
    cout << A[i] << endl; 
    } 

    return 0; 
} 

void merge_sort(int A[],int p, int r) 
{ 
    if(p<r) 
    { 

    int q = (r-p)/2; 
    merge_sort(A,p,q); 
    merge_sort(A,q,r); 
    merge(A,p,q,r); 
    } 
    return; 
} 

void merge(int A[], int p, int q, int r) 
{ 
    int n1 = q-p; 
    int n2 = r-q; 
    int L[n1+1], R[n2+1]; 
    for(int i=0; i<n1; ++i) 
    { 
    L[i] = A[p+i]; 
    } 
    for(int i=0; i<n2; ++i) 
    { 
    R[i] = A[q+i]; 
    } 
    L[n1] = R[n2] = infinity; 
    for(int i=0; i<=n1; ++i) 
    { 
    cout << L[i] << endl; 
    } 

    for(int j=0; j<=n2; ++j) 
    { 
    cout << R[j] << endl; 
    } 
    for(int i=0, j=0, k=p; k<r; ++k) 
    { 
    if(L[i] <= R[j]) 
    { 
     A[k] = L[i]; 
     ++i; 
    } 
    else 
    { 
     A[k] = R[j]; 
     ++j; 
    } 
    } 
    return; 
} 

Aber ich bekomme Segmentierung Fehler. Was mache ich falsch?

+5

Haben Sie versucht, einen Debugger zu verwenden? –

+0

Ich weiß nicht, was das ist. Ich code normalerweise in PHP, für Webseiten. –

+2

@ eddard.stark Dann ist dies eine gute Gelegenheit, es herauszufinden. –

Antwort

1

, dass eine Art und Weise auf Linux gehen würde:

  1. mit Debug-Informationen Kompilieren Sie Ihr Programm (g++ -g merger_sort.cpp -o merger_sort)
  2. laden sie in debuger: >>> gdb merge_sort
  3. Run it: (gdb) run.

Sie werden sehen:

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400b1e in merge_sort (A=0x7ffffffddda0, p=0, r=1) 
  1. Blick auf die Position im Code: (gdb) layout src
  2. Blick auf die Backtrace: (gdb) bt

Es ist ziemlich lang ... Also hast du einen Stack-Overflow :) USE-Debugger auch warum.