一、排序思想
先分割,分成不可再分,再开始合并,在合并中通过比较完成排序
以升序为例
二、代码实现
以升序为例,可以通过改变比较逻辑完成降序等
/**
* 归并排序
* 时间复杂度: O(nlogn)
* 空间复杂度: O(n):辅助数组的长度
*/
//[left...right]左闭右闭,传值时注意
public class MergeSort {
public void merge(int[] nums, int left, int right, int[] temp) {
if (left < right) {
//向下取整,防止两数过大相加溢出
int mid = left + ((right - left) >> 1);
merge(nums, left, mid, temp);
merge(nums, mid + 1, right, temp);
sort(nums, left, mid, right, temp);
}
}
private void sort(int[] nums, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0;
while (i <= mid && j <= right) {
if (nums[i] < nums[j]) {
temp[t++] = nums[i++];
} else {//nums[i] >= nums[j]
temp[t++] = nums[j++];
}
}
while (i <= mid) {
temp[t++] = nums[i++];
}
while (j <= right) {
temp[t++] = nums[j++];
}
t = 0;
while (left <= right) {
nums[left++] = temp[t++];
}
}