本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第\lfloor N/2 +1\rfloor⌊N/2+1⌋大的元素。其中集合元素的类型为自定义的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
程序代码:
//希尔排序 O(nlog2n)
ElementType Median(ElementType A[], int N)
{
int i, j, Increment;
ElementType Tmp;
for (Increment = N / 2; Increment > 0; Increment /= 2) { //设置增量,一般为数组长度的一半
for (i = Increment; i < N; i++) {
Tmp = A[i];//将A[5]的值存到临时变量temp中
for (j = i; j >= Increment; j -= Increment) {
if (Tmp < A[j - Increment])//如果A[5]的值小于A[0],则把A[0]的值赋给A[5]
{
A[j] = A[j - Increment];
}
else
break;
}
A[j] = Tmp;//因为J经过递减,此时A[J]其实为A[0],把TEMP中A[5]的初始值赋予A[0],完成两个位置的值的交换
}
}
return A[N / 2];
}