4-11 求自定類型元素序列的中位數 (25分)
本題要求實現一個函數,求N個集合元素A[]的中位數,即序列中第⌊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
學習了一下希爾排序,原地算法之一,每一次二分步長,將步長內可到達的每一個數都視為同一組,再對每一組進行直接插入排序,以前一直以為是兩兩之間排序,樣例都過不了……
代碼:
ElementType Median( ElementType A[], int N )
{
int i,j,gap;
for (gap=N>>1; gap; gap>>=1)
{
for (i=gap; i<N; ++i)
{
for (j=i-gap; j>=0&&A[j]>A[j+gap]; j-=gap)
{
ElementType temp=A[j];
A[j]=A[j+gap];
A[j+gap]=temp;
}
}
}
return A[N>>1];
}
