【PTA基础编程题目集(C语言)】6-11 求自定类型元素序列的中位数

本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊(N+1)/2⌋大的元素。其中集合元素的类型为自定义的ElementType。

函数接口定义:

ElementType Median( ElementType A[], int N );

其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回N个A[]元素的中位数,其值也必须是ElementType类型。

裁判测试程序样例:

#include <stdio.h>

#define MAXN 10
typedef float ElementType;

ElementType Median( ElementType A[], int N );

int main ()
{
    ElementType A[MAXN];
    int N, i;

    scanf("%d", &N);
    for ( i=0; i<N; i++ )
        scanf("%f", &A[i]);
    printf("%.2f\n", Median(A, N));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

3
12.3 34 -5

输出样例:

12.30

ElementType Median(ElementType A[], int N)
{
    int gap, i, j;
    ElementType temp;
    for (gap = N / 2; gap >= 1; gap /= 2)
    {
        for (i = gap; i < N; i++)
        {
            temp = A[i];
            for (j = i - gap; j >= 0 && A[j] > temp; j -= gap)
                A[j + gap] = A[j];
            A[j + gap] = temp;
        }
    }    //希尔排序over
    return A[N / 2];
}

注意事项:

一开始只学了冒泡排序和选择排序,用了冒泡排序行不通,后面看了文章尝试用快速排序也行不通(手动测试没问题但是PTA过不了,可能和基准数的优化有关,这块我不懂),在之后就尝试学习希尔排序并成功使用。

吐槽一下返回值,无论是按照题目要求返回 A[(N+1)/2] 还是按照中位数概念写成下面的代码,都不能全部运行成功。能全部运行成功的是返回 A[N/2] ,我不理解。

if (N % 2 == 0)
    return (A[N / 2 - 1] + A[N / 2]) / 2;
else
    return A[(N + 1) / 2 - 1];

参考文章

1.六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序   作者:双鱼211

2.C排序算法   作者:未知

感谢上述作者提供的满满干货,非常感谢!

如有问题,欢迎提出。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花辞树dor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值