PTA6-11 自定义元素序列的中位数

本文介绍了一种使用希尔排序算法高效求解集合中位数的方法。通过分组比较和交换元素,希尔排序能有效避免大数据集下冒泡排序和快速排序的效率瓶颈。文章详细展示了希尔排序的实现代码,并通过一个具体的示例演示了如何求解集合的中位数。

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

函数接口定义:

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

其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回NA[]元素的中位数,其值也必须是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

本题考点在排序算法的选择。 采用冒泡排序和快速排序,大N时运行超时。参考他人博客得知,采用希尔排序。

ElementType Median( ElementType A[], int N )
{
    int increasement = N;
	int i, j, k;
	do
	{
		// 确定分组的增量
		increasement = increasement / 3 + 1;
		for (i = 0; i < increasement; i++)
		{
			for (j = i + increasement; j < N; j += increasement)
			{
				if (A[j] < A[j - increasement])
				{
					ElementType temp = A[j];
					for (k = j - increasement; k >= 0 && temp < A[k]; k -= increasement)
					{
						A[k + increasement] = A[k];
					}
					A[k + increasement] = temp;
				}
			}
		}
	} while (increasement > 1);

	return A[N/2];
}

 

### 关于 PTA 练习题 6-11 自定义类型中位数计算的方法 在处理自定义类型的中位数计算时,通常需要考虑以下几个方面: #### 数据结构的选择 对于自定义数据类型中的中位数计算,首先应明确输入的数据形式以及如何存储这些数据。如果数据量较大或者动态变化频繁,则可以采用堆(Heap)来实现高效的中位数维护[^4]。 #### 堆的应用 一种常见的解决方案是利用两个优先队列(Priority Queue),即最大堆和最小堆: - **最大堆**用于保存较小的一半数值; - **最小堆**则负责较大的一半部分。 通过这种方式能够快速获取当前集合的中间值作为中位数。当新元素加入时,需判断其应该放入哪个堆并调整两者的平衡状态以保持总数差异不超过一[^5]。 ```python import heapq class MedianFinder: def __init__(self): self.small = [] # the smaller half of numbers, max heap (invert min-heap) self.large = [] # the larger half of numbers, min heap def addNum(self, num: int) -> None: if not self.large or num >= self.large[0]: heapq.heappush(self.large, num) if len(self.large) > len(self.small)+1: val = heapq.heappop(self.large) heapq.heappush(self.small, -val) else: heapq.heappush(self.small, -num) if len(self.small) > len(self.large): val = -heapq.heappop(self.small) heapq.heappush(self.large, val) def findMedian(self) -> float: if len(self.small) == len(self.large): return (-self.small[0]+self.large[0])/2.0 else: return float(self.large[0]) ``` 上述代码展示了基于Python语言的一个简单实现例子[^6]。 #### 排序法 另一种较为直观但效率较低的方式是对整个数组先进行排序再找出位于中心位置的那个数或平均值得到最终结果。这种方法适用于一次性操作而非持续更新场景下的解过程[^7]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值