4-11 求自定类型元素序列的中位数
本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第大的元素。其中集合元素的类型为自定义的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
解题思路:
一开始选了冒泡排序
,最后一个数据点超时。换成选择排序
,最后一个数据点依然超时。选择排序
在排序的过程中已经形成了部分最终序列,而且在 i == N/2
时选择结束,这样依然超时。最后使用 qsort 才没超时。注意 qsort 的使用方法。
测试点有问题。偶数和奇数的中位数输出应该是不一样的。
反馈给姥姥后,姥姥已经更改了题目描述。
解题代码:
#include<stdlib.h>
int compare (const void *p, const void *q) {
int x = *(const int *)p;
int y = *(const int *)q;
if (x < y) {
return -1;
} else if (x > y) {
return 1;
}
return 0;
}
ElementType Median ( ElementType A[], int N ) {
qsort(A, N, sizeof(ElementType), compare);
return A[N/2];
}