DM880
DM880

Reputation: 58

Undesired behaviour in MergeSort function

I'm new to programming,I'm trying to implement a merge sort function into my program, but it's not working correctly. I went over and over the code but I can't find the problem.

If for example the user input for a 6 element array is : 3 2 4 1 6 7

The output is: 1 3 2 4 32708 32708

Can someone help me? Also, if anyone have any advice for improving my coding style would be much appreciated.Thanks.

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

int main(void) {
    int *a, n;

    a = malloc(100 * sizeof(int)); // dynamically allocating memory for original array

    if (a == NULL)
        return 1;

    printf("Enter n of elements in the array:");

    scanf("%i", &n); // n of elements the in array

    printf("Enter elements:\n");

    for (int i = 0; i < n; i++) {
        scanf("%i", &a[i]); // prompt user for input elements
    }

    int f, l, m, n1, n2; // declaring variables

    f = 0;               // first element
    l = n - 1;           // last element
    m = (f + l) / 2;     // mid point
    n1 = m + 1 - f;      // n elements l1
    n2 = l - m;          // n elements l2

    int l1[n1];          // temp array 1
    int l2[n2];          // temp array2

    for (int i = 0; i < n1; i++) {
        l1[i] = a[i];    // copy elements into temp l1
    }
    for (int j = 0; j < n2; j++) {
        l2[j] = a[m + 1 + j]; // copy elements into temp l2
    }

    int i, j, k; // variable for arrays index

    i = 0;
    j = 0;
    k = 0;

    //sorting and copying elements in original array

    while (i < n1 && j < n2) {
        if (l1[i] <= l2[j]) { // if element l1 smaller or equal to l2 element
            a[k] = l1[i];     // copy element l1 into original array
            i++;              // increment l1
        } else {              // if element l1 bigger than l2
            a[k] = l2[j];     // copy element l2 into original array
            j++;              // increment l2
        }
        k++; // increment original array
    }

    // copy remaining elements (if any)
    while (i < n1) {
        a[k] = l1[i];
        i++;
        k++;
    }

    while (j < n2) {
        a[k] = l2[i];
        j++;
        k++;
    }

    printf("Your sorted array:\n");

    for (int d = 0; d < n; d++) {
        printf("%i ", a[d]); // print sorted array
    }

    printf("\n");

    free(a); // freeing original array
}

Upvotes: 2

Views: 40

Answers (1)

jacob galam
jacob galam

Reputation: 811

You need to merge recursively. You wrote only the merge part and not the recursive sort function.

More info: https://www.geeksforgeeks.org/merge-sort/

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

void merge(int arr[], int l, int m, int r) 
{ 
    int i, j, k; 
    int n1 = m - l + 1; 
    int n2 = r - m; 
  
    /* create temp arrays */
    int L[n1], R[n2]; 
  
    /* Copy data to temp arrays L[] and R[] */
    for (i = 0; i < n1; i++) 
        L[i] = arr[l + i]; 
    for (j = 0; j < n2; j++) 
        R[j] = arr[m + 1 + j]; 
  
    /* Merge the temp arrays back into arr[l..r]*/
    i = 0; // Initial index of first subarray 
    j = 0; // Initial index of second subarray 
    k = l; // Initial index of merged subarray 
    while (i < n1 && j < n2) { 
        if (L[i] <= R[j]) { 
            arr[k] = L[i]; 
            i++; 
        } else { 
            arr[k] = R[j]; 
            j++; 
        } 
        k++; 
    } 
  
    /* Copy the remaining elements of L[], if there are any */
    while (i < n1) { 
        arr[k] = L[i]; 
        i++; 
        k++; 
    } 
  
    /* Copy the remaining elements of R[], if there are any */
    while (j < n2) { 
        arr[k] = R[j]; 
        j++; 
        k++; 
    } 
} 

void mergeSort(int arr[], int l, int r) 
{ 
    if (l < r) { 
        // Same as (l+r)/2, but avoids overflow for 
        // large l and h 
        int m = l + (r - l) / 2; 
  
        // Sort first and second halves 
        mergeSort(arr, l, m); 
        mergeSort(arr, m + 1, r); 
  
        merge(arr, l, m, r); 
    } 
}

int main(void)
{
    int *a, n;

    printf("Enter n of elements in the array:");
    scanf("%i", &n); //n of elements the in array

    a = malloc(n * sizeof(int)); //dynamically allocating memory for original array
    if (a == NULL)
        return 1;

    printf("Enter elements:\n");

    for (int i = 0; i < n; i++) {
        scanf("%i", &a[i]); //prompt user for input elements
    }
    
    mergeSort(a, 0, n - 1);
    
    printf("Your sorted array:\n");

    for (int d = 0; d < n; d++) {
        printf("%i ", a[d]); //print sorted array
    }
    printf("\n");

    free(a); //freeing original array
    return 0;
}

Upvotes: 1

Related Questions