bigTree
bigTree

Reputation: 2173

Debugging a merge sort implementation in c

I am debugging a c implementation of merge sort. For some reason, the value of r (in merge) is nan. Yet, n2 (defined as (int) (r - q)) is well defined. Why is r == nan ?

#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]);
    }
}

Upvotes: 1

Views: 86

Answers (1)

David Ranieri
David Ranieri

Reputation: 41017

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

L and R are used uninitialized

Same for array:

   int x, c, *array;

   ...

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

Upvotes: 2

Related Questions