MergeSort
SRC: https://www.youtube.com/watch?v=6kQWyON6iBk&list=PLK0ZC7fyo01J-PAbYSTyiZCQXH2RSNOW_&index=3
// "static void main" must be defined in a public class.
public class MergeSort {
public static int[] mergeSort(int[] array){
int n=array.length;
if (n<2){
return array;
}
int mid=n/2;
int[] left = new int[mid];
int[] right = new int[n-mid];//take care of odd number cases
for (int i=0; i<mid; i++) {
left[i]=array[i];
}
for (int i=mid; i<n; i++) {
right[i-mid]=array[i];
}
mergeSort(left); //recurse itself to continue dividing
mergeSort(right); //recurse itself to continue dividing
merge(array, left, right, mid, rightBoundary: n-mid);
return array;
}
private static void merge(int[] array, int[] left, int[] right, int leftBoundary, int rightBoundary){
int leftIndex = 0;
int rightIndex = 0;
int arrayIndex = 0;
while (leftIndex<leftBoundary && rightIndex<rightBoundary){
//only need to compare the start of each array since we've sorted them
if (left[leftIndex]<=right[rightIndex]) {
array[arrayIndex++]=left[leftIndex++];
}else{
array[arrayIndex++]=right[rightIndex++];
}
}
}
}