Professional Documents
Culture Documents
Merge Sort
Merge Sort
Merge sort is a sorting technique based on divide and conquer technique. With worst-case
time complexity being 0(n log n), it is one of the most respected algorithms.
Merge sort first divides the array into equal halves and then combines them in a sorted
Manner. Or
Merge sort is based on the divide-and-conquer paradigm. Its worst-case running time has a
lower order of growth than insertion sort. Since we are dealing with sub-problems, we state each
sub-problem as sorting a sub-array A[p .. r]. Initially, p = 1 and r = n, but these values change as
we recurse through sub-problems.
1. Divide Step
If a given array A has zero or one element, simply return; it is already sorted. Otherwise, split
A[p .. r] into two sub-arrays A[p .. q] and A[q + 1 .. r], each containing about half of the elements
of A[p .. r]. That is, q is the halfway point of A[p .. r].
2. Conquer Step
Conquer by recursively sorting the two sub-arrays A[p .. q] and A[q + 1 .. r].
3. Combine Step
Combine the elements back in A[p .. r] by merging the two sorted sub-arrays A[p .. q] and A[q +
1 .. r] into a sorted sequence. To accomplish this step, we will define a procedure MERGE (A, p,
q, r).
Note that the recursion bottoms out when the sub-array has just one element, so that it is trivially
sorted.
To sort the entire sequence A[1 .. n], make the initial call to the procedure MERGE-SORT (A,
1, n).
MERGE-SORT (A, p, r)
We know that merge sort first divides the whole array iteratively into equal halves unless
the atomic values are achieved. We see here that an array of 8 items is divided into two
arrays of size 4.
This does not change the sequence of appearance of items in the original. Now we divide
these two arrays into halves.
We further divide these arrays and we achieve atomic value which can no more be divided.
Now, we combine them in exactly the same manner as they were broken down. Please
note the color codes given to these lists.
We first compare the element for each list and then combine them into another list in a
sorted manner. We see that 14 and 33 are in sorted positions. We compare 27 and 10 and
in the target list of 2 values we put 10 first, followed by 27. We change the order of 19
and 35 whereas 42 and 44 are placed sequentially.
In the next iteration of the combining phase, we compare lists of two data values, and
merge them into a list of found data values placing all in a sorted order.
After the final merging, the list should look like this –
ALGORITHM
Merge sort keeps on dividing the list into equal halves until it can no more be divided. By
definition, if it is only one element in the list, it is sorted. Then, merge sort combines the
smaller sorted lists keeping the new list sorted too.
PSEUDOCODE
We shall now see the pseudodes for merge sort functions. As our algorithms point out
two main functions − divide & merge.
Merge sort works with recursion and we shall see our implementation in the same way.
l2 = mergesort( l2 )
return merge( l1, l2 )
end procedure
var c as array
while ( a and b have elements )
if ( a[0] > b[0] )
add b[0] to the end of c
remove b[0] from b
else
add a[0] to the end of c
remove a[0] from a
end if
end while
while ( a has elements )
add a[0] to the end of c
remove a[0] from a
end while
return c
end procedure
Merge sort is a sorting technique based on divide and conquer technique. With the worstcase
time complexity being Ο(n log n), it is one of the most respected algorithms.
Implementation
We shall see the implementation of merge sort in C programming language here –
#include <stdio.h>
#define max 10
int a[10] = { 10, 14, 19, 26, 27, 31, 33, 35, 42, 44 };
int b[10];
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]);
}
If we compile and run the above program, it will produce the following result –
while(i<=mid)
t[k++]=a[i++];
while(j<=high)
t[k++]=a[j++];
for(i=low;i<=high;i++)
a[i]=t[i];
}
mergesort(low,mid,high);
}
}
OUTPUT:
How many elements you want to sort ? : 7
Enter elements for an array : 88 45 54 8 32 6 12
After Sorting the elements are : 6 8 12 32 45 54 88
Divide and Conquer:- This is a special case of recursion in which given problem is divided into
two or more sub-problems of exactly same type and solution to problem is expressed in terms of
solution to sub-problem. i.e. Dividing the list of elements into two approximately equal parts
recursively and find solution independently then merged together into single list. Quick and
merge sorts are based on Divide and Conquer concept.
Two types of sorting algorithms which are based on this divide and conquer algorithm :
1. Quick sort: Quick sort also uses few comparisons (somewhat more than the other two). Like
heap sort it can sort "in place" by moving data in an array.
2. Merge sort: Merge sort is good for data that's too big to have in memory at once, because its
pattern of storage access is very regular. It also uses even fewer comparisons than heap sort,
and is especially suited for data stored as linked lists.