本题要求实现一个函数,求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排序算法 作者:未知
感谢上述作者提供的满满干货,非常感谢!
如有问题,欢迎提出。