C++ 之归并排序模板
描述: 归并排序其实是分治的思想。先数组多次分成左边区间和右边区间,直到每个区间只有一个元素的时候开始将左区间和右区间合并(排序的过程在合并中),直到恢复成原来的数组。
#include <iostream>
#include <vector>
using namespace std;
// 合并(排序函数)
void mergeSort(vector<int>& nums, int left, int mid, int right) {
vector<int> tmp(right - left + 1); //用来存储本轮已经排序好的数组
int i = left, j = mid + 1; // i是左端数组的起点,j是右端数组的起点
int index = 0;
while (i <= mid && j <= right) {
if (nums[i] < nums[j]) {
tmp[index++] = nums[i++];
}
else {
tmp[index++] = nums[j++];
}
}
// 可能左端数组还有剩下的数字
while (i <= mid) tmp[index++] = nums[i++];
// 可能右端数组还有剩下的数字
while (j <= right) tmp[index++] = nums[j++];
// tmp是排序好的数组,将tmp的内容拷贝到原始数组nums中
index = 0;
for (int k = left; k <= right; ++k) {
nums[k] = tmp[index++];
}
// 到这里,原始数组nums的下标[left, right]部分已经排序好了
// 由nums的[left, mid] 和 nums的 [mid + 1, right]部分合并而成,因此合并的过程就是排序的过程
}
void merge(vector<int>& nums, int left, int right) {
// left = right 的时候说明已经只剩下一个数了,所以不再向下分开成左右数组
if (left < right) {
int mid = left + ((right - left) >> 1);
merge(nums, left, mid); // 拆分左端数组
merge(nums, mid + 1, right); //拆分右端数组
mergeSort(nums, left, mid, right); // 将左右数组合并(在合并的过程排序)
}
}
int main() {
vector<int> nums = {1, 4, 5, 5, 8, 9, 3, 2};
merge(nums, 0, nums.size() - 1);
cout << "排序好的数组为:" << endl;
for (int n : nums) {
cout << n << " ";
}
return 0;
}
586

被折叠的 条评论
为什么被折叠?



