MERGE SORT

Merge Sort is a divide and conquer algorithm that was invented by John von Neumann in 1945.
Conceptually, a merge sort works as follows:
  • Divide the unsorted list into n sublists, each containing 1 element (a list of 1 element is considered sorted).
  • Repeatedly merge sublists to produce new sorted sublists until there is only 1 sublist remaining. This will be the sorted list.
    It a stable sort, which means that the implementation preserves the input order of equal elements in the sorted output.

    EXAMPLE

    Reference: Wikipedia

    MERGE SORT C-CODE


    // C program for implementation of Merge sort
    #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 lower index and u is upper index of the
       sub-array of arr to be sorted */
    void mergeSort(int arr[], int l, int u)
    {
        if (l < u)
        {
            // Same as (l+u)/2, but avoids overflow for
            // large l and h
            int m = l+(u-l)/2;
            // Sort first and second halves
            mergeSort(arr, l, m);
            mergeSort(arr, m+1, u);
            merge(arr, l, m, u);
        }
    }
     int main()
    {
        int arr[] = {6, 3, 5, 2, 8, 10, 9};
        int n = sizeof(arr)/sizeof(arr[0]);
        int i, j,temp;
        //Merge Sort calling
        mergeSort(arr, 0, n - 1);
        printf("Sorted array: \n");
        for (int i=0; i < n; i++)
        {
            printf("%d ", arr[i]);
        }
        return 0;
    }

    OutputSorted array:
    2  3  5  6  8  9  10

    COMPLEXITY ANALYSIS

    • Best, Average and Worst Case Time Complexity: O(nLog(n) ).
    • Auxiliary Space Complexity: O(n).