ポータル
6-11カスタムタイプの要素のシーケンスの中央値を見つける(25ポイント)
この質問では、シーケンス内の⌊(N + 1)/ 2であるN個のセット要素A []の中央値を見つける関数を実装する必要があります。 ⌋大きな要素。コレクション要素のタイプはカスタム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
明らかに、と非効率的な直接挿入ソート、選択ソート、バブルソートなどのソート方法を、彼らは、このノードを渡すだけで23ポイントを獲得することはできません:
使用ヒルは、ソートする最も簡単なヒル意志もTLEを使用して(この問題を解決します、わずかに最適化されたヒルを使用する必要があります)
ElementType Median( ElementType A[], int N )
{
#define n N
#define a A
int gap,i,j;
for(gap=n/2;gap>0;gap/=2)
for(i=gap;i<n;i++)
for(j=i-gap;j>=0&&a[j]>a[j+gap];j-=gap)
{
float temp=a[j];a[j]=a[j+gap];a[j+gap]=temp;}//Swap(a[j], a[j + gap]);
return a[n/2];
}