DEV Community

Sumeet M
Sumeet M

Posted on • Updated on

Merge Sort in C

Merge Sort is a Divide and Conquer algorithm which sorts given set of elements recursively.

Merge Sort

Pseudocode of merge sort can be written as follows:

//A->array, l->left most index, r->right most index
MERGE-SORT(A, l, r)//function named “MERGE-SORT” to sort the array “A”, with the lower bound “l” and upper bound “r” and splits the array later into two parts.
    if  l < r
        mid = (l+(r-l)/2)
    MERGE-SORT(A, l, mid)// Function call keeps on splitting the left part of the array till single element is achieved.

    MERGE-SORT (A, mid+1, r)// Function call keeps on splitting the right part of the array till single element is achieved..

    MERGE(A, l, mid ,r)
end func

MERGE(A, l, mid, r)
    nL = mid-l+1 //nL tells the max number of elements in the array L
    nR = r-mid //nR tells the max number of elements in the array R
    Create arrays L[1..nL+1] and R[1..nR+1]
    for  i=0 to nL-1
        L[i] = A[l+i]
   end for
    for j=0 to nR-1 // adds elements to the initial array A
        R[j] = A[m+l+j]
    end for

    i=0;  j=0;  k=l;
    while  i < nL and j < nR  // adds elements to the initial array A
        if  L[i] <= R[j]
            A[k]=L[i];  i=i+1;  k=k+1;
        else
            A[k]=R[j];  j=j+1;  k=k+1;
    end while

    while  i < nL  // adds elements to the initial array A
        A[k]=L[i];  i=i+1;  k=k+1;
    end while

    while  j < nR  // adds elements to the initial array A
        A[k]=R[j];  j=j+1;  k=k+1;
    end while
end func

Merge Sort Explained:

C program for Merge Sort

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

// Merges two subarrays of arr[ ]. 
// First subarray is arr[l..m] 
// Second subarray is arr[m+1..r] 
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++; 
    } 
} 

/* l is for left index and r is right index of the 
sub-array of arr to be sorted */
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); 
    } 
} 

/* UTILITY FUNCTIONS */
/* Function to print an array */
void printArray(int A[ ], int size) 
{ 
    int i; 
    for (i=0; i < size; i++) 
        printf("%d ", A[i]); 
    printf("\n"); 
} 

/* Driver program to test above functions */
int main() 
{ 
    int arr[] = {12, 11, 13, 5, 6, 7}; 
// or you can take input direct from the user itself using scanf function
    int arr_size = sizeof(arr)/sizeof(arr[0]); 

    printf("Given array is \n"); 
    printArray(arr, arr_size); 

    mergeSort(arr, 0, arr_size - 1); 

    printf("\nSorted array is \n"); 
    printArray(arr, arr_size); 
    return 0; 
} 

Top comments (0)