归并排序是利用分治的思想进行排序
分为三步:
1.划分问题
2.递归求解
3.合并问题
来看代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<cmath>
#include<algorithm>
#define INF (1ll<<60)-1
using namespace std;
void merge_sort(int A[],int x,int y,int T[]);
int main()
{
int n,A[100],T[100];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&A[i]);
merge_sort(A,0,n,T);
for(int j=0;j<n;j++) printf("%d ",A[j]);
return 0;
}
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])//当前半部分的数字小于q对应的数时才进行复制
)
T[i++]=A[p++];
else T[i++]=A[q++];
}
for(i=x;i<y;i++) A[i]=T[i];// 把转移空间中的数全部再转移到A当中
}
}