2014-05-18 2 views
0

.txt 파일의 역전 횟수를 계산하는 프로그램을 작성했습니다 (첫 번째 숫자 - 숫자가 아닌 숫자 자체). 작은 입력 (5 또는 10 수)에 그것을 잘 작동하지만, 입력은 10 만 개 숫자 (각 숫자보다 10 만) 나는 다음과 같은 오류 얻을 때 :큰 입력에 대해 해제 된 개체의 체크섬이 잘못되었습니다.

#include <stdio.h> 

long int merge(int *arr, const int start, const int half, const int end) 
{ 
     int s=start; 
     int i=0; 
     int cinv=0; 
     int j=half+1; 
     int* barr = new int[end+start-1]; 

     while((s<=half)&&(j<=end)){ 
       if(arr[s]<=arr[j]){ 
         barr[i]=arr[s]; 
         s++; 

       } 
       else{ 
         barr[i]=arr[j]; 
         j++; 
         cinv++; 
       } 
       i++; 
     } 

     if(s>half){ 
       for(int k = j;k<=end;k++){ 
         barr[i]=arr[k]; 
         i++; 
       } 
     } 
     else{ 
       for(int k=s;k<=half;k++){ 
         barr[i]=arr[k]; 
         i++; 
       } 
     } 

     for(int k=0;k<=end-start;k++) { 
       arr[k+start]=barr[k]; 
     } 
     delete[] barr; 
     return cinv; 
} 

long int mergesort(int* arr, int start, int end){ 
    int half=(start+end)/2; 
    long int cinv=0; 

    if (start<end){ 
     cinv+=mergesort(arr, start, half); 
     cinv+=mergesort(arr, half+1, end); 
     cinv+=merge(arr, start, half, end); 
     return cinv; 
    } 

    return cinv; 
} 

int main(){ 
    int len; 
    freopen("input.txt", "rt", stdin); 
    freopen("output.txt", "wt", stdout); 
    scanf("%d", &len); 
    int *arr= new int[len]; 

    for (int i=0; i<len; i++){ 
     scanf("%d", &arr[i]); 
    } 

    long int cinv=mergesort(arr, 0, len-1); 

    printf("\nInversions with merge=%ld", cinv); 

    delete [] arr; 
    return 0; 
} 
: 여기

incorrect checksum for freed object - object was probably modified after being freed. 
*** set a breakpoint in malloc_error_break to debug*** 

를 코드입니다

미리 도움을 주셔서 감사합니다.

+0

이 코드는 절대적으로 C++가 아니기 때문에 'c'태그를 추가하는 것이 적절할 수도 있습니다. – Columbo

+0

'main()'에서'barr' 배열의 점은 무엇입니까? 초기화하고 int를 할당 한 다음 다시는 아무 것도하지 않습니다. – Daniel

+0

'병합'에서 보조 배열'barr'의 차원은'end - start + 1'이어야합니다. –

답변

2

merge에 임시 배열의 차원,

int* barr = new int[end+start-1]; 

이 올바르지 않습니다. mergestart == 0end == 1으로 호출하면 배열 크기가 0이됩니다. 배열의 다른 쪽 끝에는 필요한만큼 메모리가 두 배 할당됩니다. 이것을 다음으로 변경하십시오 :

int* barr = new int[end - start + 1]; 

0 바이트를 할당하는 것은 구현 정의입니다. 작은 입력 배열을 사용하더라도 내 Linux 플랫폼에서 프로그램이 안정적으로 작동하지 않습니다.

관련 문제