Merge sort works on the principle of divide and conquer.
Divide the list in 2 sub-lists, and repeat until there is only 1 element, a sub-list with single element is already sorted.
Now merge the sorted sub-lists to get a sorted list until there is only a single sorted list.
Algorithm:
1. MergeSort(Arr, p ,r)
2. if(p < r)
3. q=[p+r/2];
4. MergeSort(Arr, p,q); //left sub array
5. MergeSort(Arr, q+1,r); // right sub array
6. Merge(Arr, p , q, r); //Merge, sorted sub arrays [takes O(n) ]
Following program implements Merge sort in java.
Complexity analysis:
Since each problem is divided in 2 sub problems and then these sub problems merged.
Total time required will be T(n)= 2T(n/2)+O(n)
where O(n) is to merge sub problems.
Using Master theorem #case2 solution to above equation comes as O(n logn).
In worst case scenario Merge sort beats Quick sort which requires O(n^2)
worst case time.
For more analysis follow wikipedia: Merge_sort#Analysis
In the worst case, the number of comparisons merge sort makes is equal to or slightly smaller than (n logn - 2 logn + 1), which is between (n lg n - n + 1) and (n lg n + n + O(lg n))
Divide the list in 2 sub-lists, and repeat until there is only 1 element, a sub-list with single element is already sorted.
Now merge the sorted sub-lists to get a sorted list until there is only a single sorted list.
Algorithm:
1. MergeSort(Arr, p ,r)
2. if(p < r)
3. q=[p+r/2];
4. MergeSort(Arr, p,q); //left sub array
5. MergeSort(Arr, q+1,r); // right sub array
6. Merge(Arr, p , q, r); //Merge, sorted sub arrays [takes O(n) ]
Following program implements Merge sort in java.
/**
* @author Vikky.Agrawal
*
*/
public class MergeSort {
int[] arr;
MergeSort(){
arr=new int[] { 5, 3, 1, 2, 9, 8 };
}
/**
* @param args
*/
public static void main(String[] args) {
MergeSort obj = new MergeSort();
obj.operate();
}
public void operate(){
System.out.println("Array before sortings: ");
printArray();
mergeSort(arr,0,5);
System.out.println("Sorted array : ");
printArray();
}
public void mergeSort(int[] arr, int p, int r){
if(p<r){
int q=(p+r)/2;
mergeSort(arr, p, q);
mergeSort(arr, q+1, r);
merge(arr,p,q,r);
}
}
public void merge(int[] arr, int p, int q, int r){
int length=arr.length;
int[] tempArray =new int[length];
for (int i=0;i<length; i++) {
tempArray[i]=arr[i];
}
int temp=p;
int i=p,j=q+1;
for(; i<=q && j<=r ; ){
if(tempArray[i] < tempArray[j]){
arr[temp++]=tempArray[i];
i++;
}else{
arr[temp++]=tempArray[j];
j++;
}
}
while(i <= q){
arr[temp++]=tempArray[i];
i++;
}
while(j < r){
arr[temp++]=tempArray[j];
j++;
}
}
public void printArray(){
for (int a : arr) {
System.out.print(a + " ");
}
System.out.println();
}
}
Complexity analysis:
Since each problem is divided in 2 sub problems and then these sub problems merged.
Total time required will be T(n)= 2T(n/2)+O(n)
where O(n) is to merge sub problems.
Using Master theorem #case2 solution to above equation comes as O(n logn).
In worst case scenario Merge sort beats Quick sort which requires O(n^2)
worst case time.
For more analysis follow wikipedia: Merge_sort#Analysis
In the worst case, the number of comparisons merge sort makes is equal to or slightly smaller than (n logn - 2 logn + 1), which is between (n lg n - n + 1) and (n lg n + n + O(lg n))
No comments:
Post a Comment