归并排序
时间复杂度O(nlogn)
/**
归并排序,基于分治,时间复杂度O(nlogn)
每次将数组分成两半,然后分别排序,再调用合并两个有序数组方法
*/
public void mergeSort(int[] nums, int l, int r) {
if (l >= r) return;
int mid = (l + r) >> 1; // 取中值点
mergeSort(nums, l, mid);
mergeSort(nums, mid + 1, r);
merge(nums, l, mid, r);
}
/**
* 合并两个有序数组
*/
void merge(int[] nums, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left, j = mid + 1;
// 合并
for (int k = 0; k < temp.length; k++) {
// 谁小要谁,i在范围内或者j出界
if (j > right || (i <= mid && nums[i] <= nums[j])) {
temp[k] = nums[i++];
} else {
temp[k] = nums[j++];
}
}
// 复制到nums
for (int k = 0; k < temp.length; k++) {
nums[left + k] = temp[k];
}
}