2016-08-22 41 views
0

在stackoverflow上有幾個與此錯誤有關的問題,我知道它與數組的過量內存使用有關,或者當使用指針時(我也嘗試過使用向量)但使用一個小數組,它仍然顯示這個錯誤。先前的相同代碼運行正常(用於合併排序數組)。分段錯誤:11對陣列/向量的小輸入

我的輸入如下:

輸出:

分段故障: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

你有沒有通過調試器中運行呢? –

+5

正如你所知,'int ar [n];'是非標準的C++,真的不應該使用,即使你的編譯器允許它並且可以使用它。另外,如果你要在這裏發佈你的代碼,你應該給你的變量更好的名字。 – Xirema

+0

是的,我通過調試器運行它。 我會用更好的變量名稱和使用向量來重寫我的代碼@Xirema –

回答

2

問題部分與m=r+(l-r)/2。當l0r1時,(l-r)/20。這使得m等於1,l等於0,並且r等於1mergesort(ar, l, m);的調用與它剛剛完成的調用相同。堆棧增長無限,直到出現分段錯誤。解決這個問題的一種方法也會使代碼更有效率,即當lr之間的差值低於某個閾值時合併列表。或者,你可以交換兩個元素,當你到這種地步lr相差一個,像這樣:

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

從我的測試來證實@jcolemang在說些什麼:任何時候'l'和'r'都相差一個,OP的代碼開始吐出不好的值。它可以無限遞歸(如你所建議的),或者它開始使'l'大於'r'。 – Xirema