PTA 基础编程题目集 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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

解析

从逻辑上来说,这道题属于简单题,只需对数组进行降序排序,然后取第(N1+/2)-1号元素即可,因为数组下标从0开始,所以有-1。但是如果用普通排序方法(如冒泡排序、插入排序等)进行排序,会在最后一个测试点上遇到运行超时的问题。为解决此问题,本题采用希尔排序。
希尔排序其实可以看做是插入排序的改进版,对间隔gap的元素分别分组进行插入排序,得到局部的有序列,gap初值取n/2(n为数组长度),然后每次循环结束后将gap折半,最后一轮排序gap=1,相当于进行了一遍插入排序。此时,得到的数列已经是降序排列。

代码

void shell_sort(ElementType a[],int n)//希尔排序 
{
	int i,j,gap;
	ElementType key;
	for(gap=n/2;gap>=1;gap/=2)
	{
		for(int i=gap;i<n;i++)
		{
			key=a[i];
			for(j=i;j>=gap&&key>a[j-gap];j-=gap)
				a[j]=a[j-gap];
			a[j]=key;
		}
	}
}

ElementType Median( ElementType A[], int N )
{
	shell_sort(A,N);
	int num=(N+1)/2-1;
	return A[num];
}

运行结果

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

神箭手

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

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

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

打赏作者

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

抵扣说明:

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

余额充值