一、归并排序
题目描述:
给定一个整数数组,将其排序。
题目解析:
- 就是排序数组。
解题思路:
- 分: 将数组一分为二为两部分,一直分解到数组的长度为 1,使整个数组的排序过程被分为「左半部分排序」+「右半部分排序」;
- 治: 将两个较短的「有序数组合并成一个长的有序数组」,一直合并到最初的长度。
解题代码:
// 时间复杂度:O(NlogN)
// 空间复杂度:O(n)
class Solution {
int[] tmp;
public int[] sortArray(int[] nums) {
tmp = new int[nums.length];
mergeSort(nums, 0, nums.length - 1);
return nums;
}
// 归并排序
public void mergeSort(int[] nums, int l, int r) {
if (l >= r) return;
int left = l;
int right = r;
int mid = (left + right) / 2;
// 分
mergeSort(nums, l, mid);
mergeSort(nums, mid + 1, r);
// 治:合并两个有序数组
int cur1 = left;
int mid + ;
left;
(cur1 <= mid && cur2 <= right) {
(nums[cur1] < nums[cur2]) tmp[i++] = nums[cur1++];
tmp[i++] = nums[cur2++];
}
(cur1 <= mid) tmp[i++] = nums[cur1++];
(cur2 <= right) tmp[i++] = nums[cur2++];
( left; j <= right; j++) {
nums[j] = tmp[j];
}
}
}


