解题思路:
详解见1169题

参考代码:

#include<stdio.h>
#include<malloc.h>
#include<math.h>
void input(int *A,int n);
void output(int *A,int n);
void Mesort(int *A,int *B,int left,int right);
void Merge(int *A,int *B,int left,int middle,int right);
void copy(int *A,int *B,int left,int right);
/*--------------------------------------------------------*/
int main()
{
    int *A,*B;
    int n;
 while(scanf("%d",&n)!=EOF&&n!=0)
     {
         A=(int *)malloc(n*sizeof(int));
         B=(int *)malloc(n*sizeof(int));
         input(A,n);
         Mesort(A,B,0,n-1);
         output(A,n);
         free(A);
         free(B);
     }
return 0;


}
/*--------------------------------------------------------*/
void Mesort(int *A,int *B,int left,int right)
{
 if(left<right)
 {
    int i=(left+right)/2;
      Mesort(A,B,left,i);
      Mesort(A,B,i+1 ,right);
      Merge(A,B,left,i,right);
 copy(A,B,left,right);
 }
}
/*--------------------------------------------------------*/
void Merge(int *A,int *B,int left,int middle,int right)
{
int  i=left,j=middle+1,k=left;

while((i<=middle)&&(j<=right))
{
    if(A[i]<=A[j])
      B[k++]=A[i++];
     else
      B[k++]=A[j++];
}

if(i>middle)
    for(int q=j;q<=right;q++)
       B[k++]=A[q];
else
    for(int q=i;q<=middle;q++)
       B[k++]=A[q];

}
/*--------------------------------------------------------*/
void copy(int *A,int *B,int left,int right)
{
   for(;left<=right;left++)
       A[left]=B[left];
}
/*-------------------------*/
void input(int *A,int n)
{
   for(int i=0;i<n;i++)
      scanf("%d",&A[i]);
}
/*-------------------------*/
void output(int *A,int n)
{
   for(int i=0;i<n-1;i++)
      printf("%d ",A[i]);
      printf("%d\n",A[n-1]);
}

别忘点赞哦-.-

点赞(4)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论