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 的使用方法。

wiki 上的 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];
}
posted @ 2016-08-03 01:04  文之  阅读(657)  评论(0编辑  收藏  举报