描述
- 基本思想:将已有序的子序列合并,得到完全有序的序列;一种常见的方法是将数据等分为二份,分别进行递归排序,之后对这两组有序的数据再进行一次排序即可;
- 基于递归的归并排序比较简单,只需要自上而下进行排序即可;而非递归版本的归并排序则需要自下而上进行排序;
- 时间复杂度:O(nlogn),空间复杂度:O(n);
- 归并排序为稳定排序算法;
- 此外,归并排序可用于求解逆序对;
源码
#pragma once
#include<vector>
#include<algorithm>
class MergeSort {
public:
void mergeSort(std::vector<int>&nums,int start,int end) {
if (end - start <= 1) return;
int mid = start + (end - start) / 2;
mergeSort(nums, start, mid);
mergeSort(nums, mid, end);
std::vector<int>tmp(end - start);
int left = start, right = mid;
for (int i = 0; i < tmp.size(); ++i) {
if (right >= end || (left < mid && nums[left] < nums[right])) {
tmp[i] = nums[left];
++left;
}
else {
tmp[i] = nums[right];
++right;
}
}
for (int i = 0; i < tmp.size(); ++i)
nums[start + i] = tmp[i];
}
void mergeSort(std::vector<int>& nums) {
int len = nums.size();
std::vector<int>tmp(len);
for (int gap = 1; gap < len; gap *= 2) {
int index = 0;
while (index + gap < len) {
int left = index, right = index + gap;
int lend = index + gap, rend = std::min(index + 2 * gap, len);
int i = 0;
while (left < lend || right < rend) {
if (right >= rend || (left < lend && nums[left] < nums[right])) {
tmp[i] = nums[left];
++left;
}
else {
tmp[i] = nums[right];
++right;
}
++i;
}
for (int j = 0; j < i; ++j)
nums[index++] = tmp[j];
}
}
}
};