归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
1 算法描述 把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排序好的子序列合并成一个最终的排序序列。 2 动图演示
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void merge_sort(vector<int> &q, int l, int r){
if (l >= r) return;
int mid = (l + r) / 2;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
static vector<int> w;
w.clear();
int i = l, j = mid + 1;
while(i <= mid && j <= r)
if(q[i] <= q[j])
w.push_back(q[i ++ ]);
else
w.push_back(q[j ++ ]);
while(i <= mid) w.push_back(q[i ++ ]);
while(i <= r) w.push_back(q[j ++ ]);
for(i = l, j = 0; j < w.size(); i ++ , j ++) q[i] = w[j];
}
int main()
{
int n, t;
vector<int> q;
cin >> n;
for (int i = 0 ; i < n; i ++){
cin >> t;
q.push_back(t);
}
merge_sort(q, 0, q.size() - 1);
for(auto x : q) cout << x << ' ';
cout << endl;
return 0;
}
|