归并排序采用分治策略实现对n个元素进行排序,它是一种平衡、简单的二分分治策略。
1、分解一将待排序序列分成规模大致相等的两个子序列
2、治理一对两个子序列进行合并排序
3、合并一将排好序的有序子序列进行合并,得到最终的有序序列
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
template<typename T>
void printVec(vector<T>&t) {
for (T& i : t) {
<< i << " ";
cout }
<< endl;
cout }
void Merge(vector<int>&vec,int low,int mid,int high) {
<int>temp;
vectorint i = low, j = mid + 1;
while (i <= mid && j <= high) {
if (vec[i] < vec[j]) {
.push_back(vec[i++]);
temp}
else {
.push_back(vec[j++]);
temp}
}
while (i <= mid) {
.push_back(vec[i++]);
temp}
while (j <= high) {
.push_back(vec[j++]);
temp}
for (i = 0; i < temp.size(); i++) {
[i + low] = temp[i];
vec}
.clear();
temp}
void MergeSort(vector<int>&vec,int low,int high) {
if (low>=high) { return; }
int mid =(high+low) / 2;
(vec,low,mid);
MergeSort(vec,mid+1,high);
MergeSort(vec, low, mid, high);
Merge}
int main(int argc,char**argv) {
<int>vec = { 67,45,23,1,4,6,87,34,13 };
vectorint size = vec.size();
(vec,0,size-1);
MergeSort<int>(vec);
printVecreturn 0;
}
//1 4 6 13 23 34 45 67 87
1、分解
只是计算子序列的中间位置,O(1)
2、解决子问题
递归求解两个规模为n/2的子问题,2T(n/2)
3、合并
可以在O(n)时间内完成
4、平均时间复杂度为O(nlogn)
5、空间复杂度,临时缓冲区最大分配空间n,递归调用所使用的占空间为O(logn),故空间复杂度为O(n)
归并排序是稳定的排序算法