2016-08-22 13 views
0

このエラーに関するいくつかの質問がstackoverflowにありますが、配列による過剰なメモリ使用やポインタを使用しているとわかっています)、小さな配列を使用しても、このエラーは表示されます。先ほどの同じコードがうまくいきました(配列のマージソート用)。セグメンテーションフォールト:配列/ベクトルの小入力の場合は、

出力:

セグメンテーション障害:11

次のように

私の入力がありました

#include<iostream> 
#include<vector> 
using namespace std; 

void merge(vector <int> ar, int l, int m, int r){ 
    int n1 = m-l+1; 
    int n2 = r-m; 

    int L[n1]; 
    int R[n2]; 

    for (int i = 0; i < n1; ++i) 
    { 
     L[i]=ar[l+i]; 
    } 

    for (int j = 0; j < n2; ++j) 
    { 
     R[j]=ar[m+j+1]; 
    } 

    int i,j; 
    i = j = 0; 
    int k = i; 


    while(i<n1 && j<n2){ 

     if (L[i]<R[j]) 
     { 
      ar[k]=L[i]; 
      i++; 
     } 
     else if (R[j]<L[i]) 
     { 
      ar[k]=R[j]; 
      j++; 
     } 
     k++; 

    } 

    while(i<n1){ 
     ar[k]=L[i]; 
     i++; 
     k++; 
    } 
    while(j<n2){ 
     ar[k]=R[j]; 
     j++; 
     k++; 
    } 


} 


void mergesort(vector <int> ar, int l, int r){ 
    int m; 
    m=r+(l-r)/2; 
    if (l<r) 
    { 


     mergesort(ar, l, m); 
     mergesort(ar, m+1, r); 
     merge(ar, l, m, r); 
    } 
} 

void print(vector <int> ar, int size){ 

    for (int i = 0; i < size; ++i) 
    { 
     cout<<ar[i]<< " "; 
    } 


} 

int main() 
{ 
    int n; 
    cin>>n; 
    vector <int> ar; 

    for (int i = 0; i < n; ++i) 
    { 
     cin>>ar[i]; 
    } 

    print(ar,n); 
    mergesort(ar, 0, n-1); 
    print(ar, n); 



    return 0; 
} 
+0

は、デバッガを介してこれを実行した:lrが1によって異なる場合あなたがそうのように、ポイントを取得する場合や、あなただけの2つの要素を入れ替えることができますか? –

+5

あなたが知っているように、 'int ar [n];'は非標準のC++であり、あなたのコンパイラが許可していてもそれを使うことができるとしても、本当に使用すべきではありません。また、ここにコードを掲載する場合は、変数をより良い名前にする必要があります。 – Xirema

+0

はい、私はそれをデバッガで実行しました。 より良い変数名でベクトルを再投稿し、ベクトルを使う@Xirema –

答えて

2

問題の一部はm=r+(l-r)/2です。 l0であり、r1であるとき、(l-r)/20である。これにより、m1となり、l0に等しくなり、r1に等しくなり、mergesort(ar, l, m);は、直前のものと同じになります。セグメンテーション違反が発生するまで、スタックは無制限に成長します。コードをより効率的にするこれを修正する方法の1つは、lrの差がある閾値を下回ったときにリストをマージすることです。

if (l - r <= 1) { 
    int temp = ar[l]; 
    ar[l] = ar[r]; 
    ar[r] = temp; 
    return; 
} 
+1

私のテストから、@ jcolemangが言っていることを裏付ける: 'l'と' r'が1つだけ違うときはいつでも、OPのコードは悪い値を吐き出す。無限に(あなたが提案したように)再帰するか、 'l'を' r'より大きくするかのどちらかです。 – Xirema

関連する問題