2014-07-24 5 views
1

병합 정렬의 c 구현을 디버깅합니다. 어떤 이유로 인해 r (병합)의 값은 nan입니다. 그러나 n2 ((int) (r - q)으로 정의 됨)은 잘 정의되어 있습니다. r == nan은 무엇입니까?C에서 병합 정렬 구현 디버깅

#include <stdio.h> 
#include <limits.h> 
#include <math.h> 


void merge(int *A,float p,float q,float r) 
{ 
    float n = r - p + 1; /* number of elements in array A */ 
    int n1 = (int) (q - p + 1); 
    int n2 = (int) (r - q); 
    printf("n2 = %d\n",n2); 
    int i, j; 
    float k; 

    int *L, *R; 
    for (i = 1; i <= n1; i++){ 
     L[i] = A[(int) (p + i - 1)]; 
    } 

    for (j = 1; j < n2; j++){ 
     R[j] = A[(int) (q + j)]; 
    } 

    L[n1+1] = INT_MAX; 
    R[n2+1] = INT_MAX; 

    i = 1; 
    j = 1; 

    printf("p = %f\n",p); 
    printf("r = %f\n",r); 

    for (k = p; k <= r; k++){ 
     printf("k=%f\n",k); 
     if (L[i] <= R[j]){ 
      A[(int) k] = L[i]; 
      i += 1; 
     } 

     else{ 
      A[(int) k] = R[j]; 
      j += 1; 
     } 
    } 
} 

void merge_sort(int *A, float p, float r) 
{ 
    int i; 
/* for (i=0; i<=r-p;i++){ 
     printf("%d\n",A[i]); 
    }*/ 
    float q; 
    if (p < r){ 
    /* printf("merge_sort p = %d\n",p); 
     printf("merge_sort r = %d\n",r);*/ 
     q = floor((p + r)/2); 
/*  printf("q = %f\n",q);*/ 
     merge_sort(A, p, q); 
     merge_sort(A, q+1, r); 
/*  printf("done\n");*/ 
     merge(A, p, q, r); 
    } 
} 


int main() 
{ 
    int x, c, *array; 
    int n; 

    printf("Enter number of elements\n"); 
    scanf("%d",&n); 

    printf("Enter %d elements\n",n); 

    for (c = 0; c < n; c++){ 
     scanf("%d", &array[c]); 
    } 

    merge_sort(array, 0, n-1); 

    for (c = 0; c < n; c++){ 
     printf("%d\n", array[c]); 
    } 
} 
+3

왜 인덱스'float'를 사용할 수 있습니까? 'int'이어야합니다. – Inspired

+2

'int'를 사용하면'floor'가 필요 없습니다. 정수 나누기 ('int'' /''int'')는 소수 부분을 잘라내는'int'를 제공합니다. – Inspired

답변

2
int *L, *R; 
for (i = 1; i <= n1; i++){ 
    L[i] = A[(int) (p + i - 1)]; 
} 

LRarray에 대한

같은 초기화되지 않은 사용됩니다

int x, c, *array; 

    ... 

    for (c = 0; c < n; c++){ 
     scanf("%d", &array[c]);