Merge Sort


Merge sort is an efficient, general-purpose, comparison-based sorting algorithm. Most implementations produce a stable sort, which means that the order of equal elements is the same in the input and output.Merge sort is a divide and conquer algorithm.



Merge Sort Visualization


A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
30 20 10 6 2 90 6 23 45 12


                                                      


                                         
                                 
                                         


                    
                             
                    
                        
                    
                            
                    




      

NOTE: This visualization looks perfect when using desktop browser in maximized window.And this visualization is not displayed correctly in firefox due to its internal bug which will replace html border color with background color.





Explanation using an example:






Merge Sort Code in C:

                      
                           #include <stdio.h>

                                 #define max 10
                                 
                                 int a[11] = { 10, 14, 19, 26, 27, 31, 33, 35, 42, 44, 0 };
                                 int b[10];
                                 
                                 void merging(int low, int mid, int high) {
                                    int l1, l2, i;
                                 
                                    for(l1 = low, l2 = mid + 1, i = low; l1 <= mid && l2 <= high; i++) {
                                       if(a[l1] <= a[l2])
                                          b[i] = a[l1++];
                                       else
                                          b[i] = a[l2++];
                                    }
                                    
                                    while(l1 <= mid)    
                                       b[i++] = a[l1++];
                                 
                                    while(l2 <= high)   
                                       b[i++] = a[l2++];
                                 
                                    for(i = low; i <= high; i++)
                                       a[i] = b[i];
                                 }
                                 
                                 void sort(int low, int high) {
                                    int mid;
                                    
                                    if(low < high) {
                                       mid = (low + high) / 2;
                                       sort(low, mid);
                                       sort(mid+1, high);
                                       merging(low, mid, high);
                                    } else { 
                                       return;
                                    }   
                                 }
                                 
                                 int main() { 
                                    int i;
                                 
                                    printf("List before sorting\n");
                                    
                                    for(i = 0; i <= max; i++)
                                       printf("%d ", a[i]);
                                 
                                    sort(0, max);
                                 
                                    printf("\nList after sorting\n");
                                    
                                    for(i = 0; i <= max; i++)
                                       printf("%d ", a[i]);
                                 }