我觉得要能独立写出某一个算法,就一定要在写代码之前有思路。时间复杂度(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("\n"); 41 }