解题思路:
详解见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]); }
别忘点赞哦-.-
0.0分
6 人评分
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:1053 |
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C++代码)(手动优化一下计算)浏览:1285 |
2003年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:684 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:1450 |
输出正反三角形 (C语言代码)浏览:794 |
1035 题解浏览:785 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:546 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:667 |
DNA (C语言代码)浏览:741 |
永远的丰碑 (C语言代码)浏览:525 |