4-11カスタムタイプ要素シーケンスの中位数を求める


本題は1つの関数を実現することを要求して、N個の集合要素A[]の中位数を求めて、つまりシーケンスの中で第⌈N/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
"
, 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];
}