注:文章仅做个人记录
参考视频:
相关题目:
力扣912. 排序数组https://leetcode.cn/problems/sort-an-array/submissions/629360156/
1.归并排序算法排序数组的递归写法
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
mergeSort(nums, 0, nums.size() - 1);
return nums;
}
void mergeSort(vector<int>& nums, int l, int r){
if(l == r){
return;
}
int m = l + ((r - l) >> 1);
mergeSort(nums, l, m);
mergeSort(nums, m + 1, r);
merge(nums, l, m, r);
}
void merge(vector<int>& nums, int l, int m, int r){
int len = r - l + 1;
vector<int> tmp(len);
int a = l;
int b = m + 1;
int i = 0; //用于遍历tmp数组
while(a <= m && b <= r){
if(nums[a] <= nums[b]){
tmp[i] = nums[a];
i++;
a++;
}else{
tmp[i] = nums[b];
i++;
b++;
}
}
while(a <= m){
tmp[i] = nums[a];
i++;
a++;
}
while(b <= r){
tmp[i] = nums[b];
i++;
b++;
}
for(int j = 0, k = l; j < len; j++, k++){
nums[k] = tmp[j];
}
}
};
2.归并排序算法排序数组的迭代写法
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
if(nums.size() <= 1){
return nums;
}
mergeSort(nums);
return nums;
}
void mergeSort(vector<int>& nums){
int len = nums.size();
for(int step = 1; step < len; step <<= 1){
int l = 0;
while(l < len){
int m = l + step - 1;
if(m + 1 >= len){ //没有匹配的右组
break;
}
int r = min((m + step), len - 1);
merge(nums, l, m, r);
l += 2 * step;
}
}
}
void merge(vector<int>& nums, int l, int m, int r){
int a = l;
int b = m + 1;
int i = 0;
int len = r - l + 1;
vector<int> tmp(len);
while(a <= m && b <= r){
tmp[i++] = nums[a] <= nums[b] ? nums[a++] : nums[b++];
}
while(a <= m){
tmp[i++] = nums[a++];
}
while(b <= r){
tmp[i++] = nums[b++];
}
for(int j = 0, k = l; k <= r; j++, k++){
nums[k] = tmp[j];
}
}
};