# C Program for Iterative Merge Sort

Last Updated : 14 Dec, 2022

Following is a typical recursive implementation of Merge Sort that uses last element as pivot.

## C

 `/* Recursive C program for merge sort */` `#include   ` `#include   ` ` `  `/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */` `void` `merge(``int` `arr[], ``int` `l, ``int` `m, ``int` `r);  ` ` `  `/* 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) {  ` `  ``int` `m = l + (r - l) / 2; ``// Same as (l+r)/2 but avoids overflow for large l & h  ` `  ``mergeSort(arr, l, m);  ` `  ``mergeSort(arr, m + 1, r);  ` `  ``merge(arr, l, m, r);  ` ` ``}  ` `}  ` ` `  `/* Function to merge the two haves arr[l..m] and arr[m+1..r] of array arr[] */` `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;  ` ` ``j = 0;  ` ` ``k = l;  ` ` ``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++;  ` ` ``}  ` `}  ` ` `  `/* 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 };  ` ` ``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;  ` `}  `

Output:

```Given array is
12 11 13 5 6 7

Sorted array is
5 6 7 11 12 13```

Time Complexity: O(n*log(n))
Auxiliary Space: O(n)

Please refer complete article on Iterative Merge Sort for more details!

Previous
Next