排序---归并排序

我觉得要能独立写出某一个算法,就一定要在写代码之前有思路。时间复杂度(o(nlog(n)))

思路: 选择数组的中间值,对起左右进行递归,其中合并两个有序的数组,最后将放到tr数组中排序好的数重新放置到原数组中。

 1 #include<cstdio>
 2 using namespace std;
 3 int sr[5],tr[5];
 4 void rMerge(int sr[],int tr[],int s,int m,int t)   //合并两个有序的数组
 5 {
 6     int i=s,j=m+1,k=s;
 7     while(i<=m&&j<=t){
 8         if(sr[i]<sr[j]) tr[k++]=sr[i++];
 9         else tr[k++]=sr[j++];
10     }
11     while(i<=m) tr[k++]=sr[i++];  //如果有多余的数,就直接加入到里面即可
12     while(j<=t) tr[k++]=sr[j++];
13 }
14 
15 void copy(int sr[],int tr[],int s,int t)
16 {
17     for(int i=s;i<=t;i++)
18     {
19         sr[i]=tr[i];
20     }
21 }
22 
23 void aSort(int sr[],int s,int t)
24 {
25     if(s<t)
26     {
27         int m=(s+t)/2;
28         aSort(sr,s,m); //对其左右分别排序
29         aSort(sr,m+1,t);
30         rMerge(sr,tr,s,m,t); //合并到tr数组
31         copy(sr,tr,s,t); //将tr数组重新返回到sr数组中
32     }
33 }
34 
35 int main()
36 {
37     for(int i=0;i<5;i++) scanf("%d",&sr[i]);
38     aSort(sr,0,4);
39     for(int i=0;i<5;i++) printf("%d ",tr[i]);
40     printf("
");
41 }
原文地址:https://www.cnblogs.com/jinhong123/p/8721110.html