public class MergeSort {
public static void sort(int[] nums) {
if (nums == null || nums.length < 2) {
return;
}
doSort(nums, 0, nums.length - 1);
}
private static void doSort(int[] nums, int startIdx, int endIdx) {
if (endIdx <= startIdx) {
return;
}
int midIdx = (startIdx + endIdx) / 2;
doSort(nums, startIdx, midIdx);
doSort(nums, midIdx + 1, endIdx);
merge(nums, startIdx, midIdx, endIdx);
}
private static void merge(int[] nums, int startIdx, int midIdx, int endIdx) {
int[] tmp = new int[endIdx - startIdx + 1];
int idx1 = startIdx;
int idx2 = midIdx + 1;
int idx = 0;
while (idx1 <= midIdx && idx2 <= endIdx) {
if (nums[idx1] <= nums[idx2]) {
tmp[idx++] = nums[idx1++];
} else {
tmp[idx++] = nums[idx2++];
}
}
while (idx1 <= midIdx) {
tmp[idx++] = nums[idx1++];
}
while (idx2 <= endIdx) {
tmp[idx++] = nums[idx2++];
}
for (int i = 0; i < tmp.length; i++) {
nums[startIdx + i] = tmp[i];
}
}
}