4-11カスタムタイプ要素シーケンスの中位数を求める
本題は1つの関数を実現することを要求して、N個の集合要素A[]の中位数を求めて、つまりシーケンスの中で第⌈N/2⌉の大きい要素です.ここで、集合要素のタイプはカスタムElementTypeです.
関数インタフェースの定義:
ElementType Median( ElementType A[], int N ); ここで、所与の集合要素は配列A[]に格納され、正の整数Nは配列要素の個数である.この関数はN個のA[]要素の中位数を返さなければならず、その値もElementTypeタイプでなければならない.
審判試験プログラムのサンプル:
入力サンプル:3 12.3 34-5出力サンプル:12.30解答プログラム:
関数インタフェースの定義:
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
", Median(A, N));
return 0;
}
/* */
入力サンプル:3 12.3 34-5出力サンプル:12.30解答プログラム:
void Swap(ElementType *a, ElementType *b){
ElementType temp = *a;
*a = *b;
*b = temp;
}
ElementType Median3(ElementType A[], int Left, int Right){
int Center = (Left + Right) / 2;
if(A[Left]>A[Center])
Swap( &A[Left], &A[Center] );
if(A[Left]>A[Right])
Swap( &A[Left], &A[Right] );
if(A[Center]>A[Right])
Swap( &A[Center], &A[Right] );
Swap( &A[Center], &A[Right-1] );
return A[Right-1];
}
void QSort(ElementType A[], int Left, int Right){
if(Left>=Right) return;
ElementType Pivot = Median3(A, Left, Right);
int i = Left, j = Right - 1;
while(1){
while( A[++i] < Pivot ) { }
while( A[--j] > Pivot) { }
if( i<j )
Swap(&A[i], &A[j]);
else break;
}
Swap(&A[i], &A[Right-1]);
QSort(A, Left, i-1);
QSort(A, i+1, Right);
}
ElementType Median( ElementType A[], int N ){
QSort(A, 0, N-1);
return A[N/2];
}