十大经典排序算法系列博客——>传送门
简介:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,是采用分治法Divide and Conquer的一个非常典型的应用。分Divide:将问题分成一些小的问题然后递归求解;治Conquer:将分的阶段得到的各答案合并在一起。
算法步骤:
-
把长度为n的输入序列分成两个长度为n/2的子序列;
-
对这两个子序列分别采用归并排序;
-
将两个排序好的子序列合并成一个最终的排序序列。
![](https://i-blog.csdnimg.cn/blog_migrate/45035d92db1fb787c966cca789d53dbe.png)
代码展示
#include<bits/stdc++.h>
using namespace std;
void merge_sort(int *A, int x, int y, int* T) {
if(y-x > 1) {
int m = x + (y-x)/2; //分治第一步:划分
int p = x, q = m, i = x;
merge_sort(A, x, m, T); //分治第二步:递归求解
merge_sort(A, m, y, T);
while(p < m || q < y) { //只要一个序列非空,就继续合并
if(q>=y || (p<m && A[p]<= A[q])) //若第二个序列为空(序列1一定非空),则复制A[p]
T[i++] = A[p++]; //否则,当且仅当第一个序列非空,且较小时,复制A[p]
else T[i++] = A[q++];
}
for(i = x; i<y; i++) A[i]=T[i];
}
}
int main() {
int n; cin >> n; int A[n];
for(int i = 0; i < n; i++) cin>>A[i];
int T[n]; memset(T, 0, sizeof(T));
merge_sort(A, 0, n, T);
for(int i = 0; i < n; i++) cout<<A[i]<<' ';
return 0;
}