已知有n堆数据进行排序(从小到大),其中每堆数据元素个数为30已经有序排列,本题要求实现一个函数,将所有数据进行排序,要求算法尽可能高效。
函数接口定义:
void sort(int a[],int n);
其中 a
和 n
都是用户传入的参数。 n
是总堆数。
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
#define N 1200
void sort(int a[],int n);
int main()
{
int i,n,a[N];
scanf("%d",&n);
for(i=0;i<n*30;i++)
scanf("%d",&a[i]);
sort(a,n*30);
for(i=0;i<(n*30);i++)
{
printf("%d ",a[i]);
if((i+1)%10==0)
printf("\n");
}
return 0;
}
/* 请在这里填写答案 */
输入样例:
3
38 281 1142 1323 2240 2437 2997 5853 7719 8365 8855 8945 9725 10450 11797 14680 15921 18457 20537 20976 21238 21655 25906 26285 28100 28881 30612 31891 32278 32285
41 153 292 491 2995 3902 4827 5436 5705 6334 9961 11478 11942 12382 14604 15724 16827 17421 18467 18716 19169 19718 19895 23281 24464 26500 26962 28145 29358 32391
45 606 2424 5557 5962 6658 7167 7512 10705 11039 12652 14590 14895 17795 17829 18316 18917 19650 23440 24198 26431 28189 28961 29216 29484 29711 29813 30085 30367 32153
输出样例:
38 41 45 153 281 292 491 606 1142 1323
2240 2424 2437 2995 2997 3902 4827 5436 5557 5705
5853 5962 6334 6658 7167 7512 7719 8365 8855 8945
9725 9961 10450 10705 11039 11478 11797 11942 12382 12652
14590 14604 14680 14895 15724 15921 16827 17421 17795 17829
18316 18457 18467 18716 18917 19169 19650 19718 19895 20537
20976 21238 21655 23281 23440 24198 24464 25906 26285 26431
26500 26962 28100 28145 28189 28881 28961 29216 29358 29484
29711 29813 30085 30367 30612 31891 32153 32278 32285 32391
下面为我的代码+注释:
int b[N];
void merge(int a[],int l,int r)
{
if(l>=r)return 0;
int mid=(l+r)/2;
merge(a,l,mid);
merge(a,mid+1,r);
int i=l,j=mid+1;
for(int k=l;k<=r;k++) //每次将较小的元素粘贴进临时存储b中
{
if((a[i]<a[j]&&i<=mid)||j>r){b[k]=a[i];i++;}
else {b[k]=a[j];j++;}
}
for(int k=l;k<=r;k++) //从b中拷贝排列好的值
a[k]=b[k];
}
void sort(int a[],int n)
{
merge(a,0,n-1);
}