Merge Sort
Algorithm
import java.util.*;
class MergeSort {
public static void main(String[] args) {
MergeSort ms = new MergeSort();
int[] arr = {38, 27, 43, 3, 9, 82, 10};
System.out.println("Before mergesort");
for(int ele: arr) System.out.println(ele);
ms.mergeSort(arr);
System.out.println("After mergesort");
for(int ele: arr) System.out.println(ele);
}
private void mergeSort(int[] nums) {
if(nums == null || nums.length < 2) {
throw new IllegalArgumentException("Invalid input is provided");
}
sort(nums, 0, nums.length-1);
}
private void sort(int[] nums, int left, int right) {
if(left < right) {
// Find the middle point
int mid = left + (right - left) / 2;
// Divide: Sort first and second halves
sort(nums, left, mid);
sort(nums, mid+1, right);
// Conquer: Merge the sorted halves
merge(nums, left, mid, right);
}
}
private void merge(int[] nums, int left, int mid, int right) {
// Sizes of two subarrays to be merged
int n1 = mid - left + 1;
int n2 = right - mid;
// Temporary array
int[] L = new int[n1];
int[] R = new int[n2];
// Copying the left subarray
for(int i=0; i<n1; i++) {
L[i] = nums[left+i];
}
// Copying the right subarray
for (int j = 0; j < n2; j++) {
R[j] = nums[mid + 1 + j];
}
// Merging the temp arrays
int i = 0, j = 0;
int k = left; // Initial index of the merged subarray
while(i < n1 && j < n2) {
// At every iteration, a number is found and stored in the nums
if(L[i] <= R[j]) { // Relative order and stability is maintained
nums[k] = L[i++];
} else {
nums[k] = R[j++];
}
k++; // Moving forward the index
}
// Copy the remaining subarrys
while(i < n1) {
nums[k++] = L[i++];
}
while(j < n2) {
nums[k++] = R[j++];
}
}
}Last updated