归并排序
1.分解:分解为两端的子数组
2.当子问题为一个数字时为最简,然后上升排序,合并解;
3.两个临近的排好序的子数组,合并解。从最开始进行比较,并准备好临时存储数组。
class Solution {
public:
void mergeSort(vector<int>& nums, int left, int right) {
if (left < right)
{
int mid = (left + right) / 2;
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
merge(nums, left, mid, right);
}
}
void merge(vector<int>& nums, int left, int mid, int right) {
vector<int> temp;
int l = left, m = mid+1;
while (l <= mid&&m <= right) {
if (nums[l] < nums[m]) {
temp.push_back(nums[l]);
l++;
}
else {
temp.push_back(nums[m]);
m++;
}
}
while (l <= mid) {
temp.push_back(nums[l]);
l++;
}
while (m <= right) {
temp.push_back(nums[m]);
m++;
}
for (int i = left; i <= right; i++) {
nums[i] = temp[i - left];
}
}
vector<int> sortArray(vector<int>& nums) { //分治法
int n = nums.size();
mergeSort(nums, 0, n - 1);
return nums;
}
};