Merge Sort

Idea#

  • Use divide and conquer paradigm

Implementation#

//merge sort
public class MergeSort{
//sort on the whole list, use p=0 and r=list.length-1
public static void mergeSort(int[] arr, int p, int r){
if(p < r){
int q = (int)Math.floor((p+r)/2);
//sort two subarrays
mergeSort(arr, p, q);
mergeSort(arr, q+1, r);
//merge sorted array
merge(arr, p, q, r);
}
}
//merge two sorted array
public static void merge(int[] arr, int p, int q, int r){
int len1 = q-p+1;
int len2 = r-q;
//create two new arrays to store sorted array
int[] arr1 = new int[len1+1];
int[] arr2 = new int[len2+1];
//fill in the new arrays
for(int i=0; i<len1; i++){
arr1[i] = arr[p+i];
}
for(int i=0; i<len2; i++){
arr2[i] = arr[q+1+i];
}
//use MAX_VALUE at the last element
arr1[len1] = Integer.MAX_VALUE;
arr2[len2] = Integer.MAX_VALUE;
int i = 0;
int j = 0;
//merge sorted list
for(int k=p; k<=r; k++){
if(arr1[i] <= arr2[j]){
arr[k] = arr1[i];
i++;
}else{
arr[k] = arr2[j];
j++;
}
}
}
}

Procedure#

  • divide array into two subarrays
  • sort each subarray
  • merge sorted subarrays into one

Time and Space Analysis#

  • Time O(nlogn)
  • Space O(nlogn)