PTA 合并排序 C语言解法

已知有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);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值