2016-08-22 4 views
0

stackoverflow에서이 오류와 관련된 몇 가지 질문이 있으며 배열에 의한 과도한 메모리 사용과 관련되거나 포인터를 사용할 때 이해합니다.)하지만 작은 배열을 사용하면 여전히이 오류가 표시됩니다. 이전의 동일한 코드가 잘 실행되고있었습니다 (배열 병합 병합).세그먼트 오류 : 배열/벡터에 대한 작은 입력에 11

5

9 8 1 2 4

출력 :

분할 고장 11

,369 다음

내 입력했다

#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 한 차이가 어디과 같이, 지점에 도착하면 또는, 당신은 단지 두 요소를 교환 할 수 있습니까? –

+5

'int ar [n];'은 비표준 C++이므로 컴파일러가 허용하고 작업 할 수 있다고하더라도 실제로 사용하면 안됩니다. 또한 여기에 코드를 게시하려면 변수를 더 잘 지정해야합니다. – Xirema

+0

예, 디버거를 통해 실행했습니다. 더 나은 변수 이름으로 벡터를 재 게시하고 @Xirema를 –

답변

2

문제의 일부는 m=r+(l-r)/2입니다. l0이고 r1 인 경우, (l-r)/20입니다. 이로 인해 m1, l0과 같고, r은 과 같고 mergesort(ar, l, m);은 방금 처리 한 것과 동일합니다. 세그먼테이션 오류가 발생할 때까지 스택이 무한대로 커집니다. 이 문제를 해결하는 한 가지 방법은 lr 사이의 차이가 특정 임계 값보다 작은 경우 목록을 병합하는 것입니다.

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

제 테스트에서 @jcolemang이 말하는 것을 뒷받침합니다 : 'l'과 'r'이 하나만 다를 때마다 OP 코드가 나쁜 값을 뱉기 시작합니다. 어느 것이나 (당신이 제안한 것처럼) 무한히 재귀하거나'r'보다'l'을 만들기 시작합니다. – Xirema