递归实现
public void mergeSortRecursion(int[] nums, int left, int right){
if (left < right){
int mid = (left + right) / 2;
mergeSortRecursion(nums,left, mid);
mergeSortRecursion(nums, mid + 1, right);
merge(nums, left, mid, right);
}
}
public void merge(int []nums, int left, int mid, int right){
int i = left;
int j = mid + 1;
int k = left;
int[] temp = new int[nums.length];
while(i <= mid || j <= right){
if (j > right || (i <= mid && nums[i] < nums[j])){
temp[k++] = nums[i++];
}else{
temp[k++] = nums[j++];
}
}
k = left;
while(k <= right){
nums[k] = temp[k];
k++;
}
}
非递归实现
public void mergeSort(int []nums){
int length = nums.length;
int[] src = nums;
int[] dst = new int[length];
for(int seg = 1; seg < length; seg += seg){
for(int start = 0; start < length; start += seg * 2){
int mid = Math.min(start + seg, length);
int end = Math.min(start + 2 * seg, length);
int i = start, j = mid, k = start;
while(i < mid || j < end){
if (j == end || (i < mid && src[i] < src[j])){
dst[k++] = src[i++];
}else{
dst[k++] = src[j++];
}
}
}
int [] temp = src;
src = dst;
dst = temp;
}
}