归并排序C++实现
归并排序用的是分治法,分治法往往用递归来实现。
分治法的核心步骤
- 分解问题
- 当子问题能直接求解时,求解子问题
- 合并子问题的解
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <list>
#include <unordered_map>
#include <unordered_set>
using namespace std;
void merge(vector<int> &nums, int low, int mid, int high)
{
vector<int> tmp(high - low + 1);
int i = low, j = mid + 1, k=0;
while (i<=mid&&j<=high)
{
if (nums[i] <= nums[j]) tmp[k++] = nums[i++];
else tmp[k++] = nums[j++];
}
if (i <= mid)
{
while (i<=mid)
{
tmp[k++] = nums[i++];
}
}
else
{
while (j <= high)
{
tmp[k++] = nums[j++];
}
}
for (i = 0; i < high - low + 1; i++)
{
nums[low + i] = tmp[i];
}
}
void mergeSort_helper(vector<int> &nums, int low, int high)
{
if (low >= high) return;
int mid = (low + high) / 2;
mergeSort_helper(nums, low, mid);
mergeSort_helper(nums, mid + 1, high);
merge(nums, low, mid, high);
}
void mergeSort(vector<int>& nums)
{
mergeSort_helper(nums, 0, nums.size()-1);
}
int main()
{
vector<int> nums = { 2,3,1,5,4,2 };
mergeSort(nums);
for (auto a : nums) cout << a << " ";
cout << endl;
system("pause");
}