2017-08-15 43 views
-2

我正在运行合并排序实现,它在https://code.hackerearth.com/4a1c9cn给出正确的结果,但在http://www.tutorialspoint.com/compile_c_online.php?PID=0Bw_CjBb95KQMVWwxWV9qYlE5V0U错误的结果。不同的C编译器给出不同的结果合并排序

有人可以告诉我的错误和要记住的事情,以避免在未来这样的错误。 样品测试用例:5 3 7 5 9 2 错误答案由所述第二编译器:03579 代码:

#include <stdio.h> 
#include <stdlib.h> 

void merge(int A[], int left[], int right[], int n) 
{ 
    int i=0, j=0, k=0, m = n/2, d = n-m; 
    while(i<m && j<d) 
    { 
     if(left[i] <= right[j]) A[k++] = left[i++]; 
     else A[k++] = right[j++]; 
    } 
    if(i == m) 
     for(;k<n; k++, j++) A[k] = right[j]; 
    else if(j == d) 
     for(; k<n; k++, i++) A[k] = left[i]; 
    return; 
} 

void MergeSort(int A[], int n) 
{ 
    if(n==1) return; 
    int m = n/2; 
    int* left = (int*)malloc(m*sizeof(int)); 
    int* right = (int*)malloc((n-m)*sizeof(int)); 
    int i, j; 
    for(i=0; i<m; i++) left[i] = A[i]; 
    for(i=m; i<n; i++, j++) right[j] = A[i]; 
    MergeSort(left, m); 
    MergeSort(right, (n-m)); 
    merge(A, left, right, n); 
    return; 
} 

int PrintArr(int A[], int n); 
void getArr (int A[], int n); 

int main(int argc, char** argv) 
{ 
    int n, *arr; 
    scanf("%d", &n); 
    arr = (int*)malloc(n*sizeof(int)); 
    getArr(arr, n); 
    MergeSort(arr, n); 
    PrintArr(arr, n); 
    return 0; 
} 
+6

我们不打算点击这些链接。标题暗示你的代码正在调用*未定义的行为*。 –

+0

需要注意的事项:避免未定义的行为,并谨慎使用实现定义的行为。但是,如果您对代码的具体情况有疑问,那么代码需要在问题*中出现*。 –

+0

嗨。为了清晰起见,我添加了代码。 –

回答

0

有益的意见之后,我能够修复代码。错误的原因是内存泄漏。修改后的代码:

#include <stdio.h> 
#include <stdlib.h> 

void merge(int A[], int l, int h) 
{ int* temp = (int*)malloc((h-l+1)*sizeof(int)); 
    int i=l, k=0, m = l + (h-l)/2, j = m+1; 
    while(i<=m && j<=h) 
    { 
     if(A[i] <= A[j]) temp[k++] = A[i++]; 
     else temp[k++] = A[j++]; 
    } 
    if(i > m) 
     for(;k<=h; k++, j++) temp[k] = A[j]; 
    else if(j > h) 
     for(; k<=h; k++, i++) temp[k] = A[i]; 
    for(i=l, k=0; i<=h; i++,k++) A[i] = temp[k]; 
    return; 
} 

void MergeSort(int A[], int l, int h) 
{ 
    if(h-l<1) return; 
    int m = l + (h-l)/2; 
    MergeSort(A, l, m); 
    MergeSort(A, m+1, h); 
    merge(A, l, h); 
    return; 
} 


int PrintArr(int A[], int n) 

void getArr (int A[], int n) 

int main(int argc, char** argv) 
{ 
    int n, *arr; 
    scanf("%d", &n); 
    arr = (int*)malloc(n*sizeof(int)); 
    getArr(arr, n); 
    MergeSort(arr, 0, n-1); 
    PrintArr(arr, n); 
    return 0; 
} 
相关问题