ページ 11

中央値のアルゴリズム

Posted: 2011年6月02日(木) 16:36
by 宗一郎
3つの数値を入力し、中央値を求めるアルゴリズムについてなのですが、
とりあえず作ってみたのですが、もっと良い方法があるのではないかと質問させていただきました。

中央値を求める関数はこれに合わせて作らなければいけません。
int med(int a, int b, int c);

以下がとりあえず作ってみた関数です。

コード:

int med(int a,int b, int c)
{
	if (a < b && a > c || a > b && a < c) { return a; }
	if (b < a && b > c || b > a && b < c) { return b; }
	return c;
}
何かほかにもっと良い方法やこんなやり方もあるよといったことがあれば、
ご教授お願いします。

Re: 中央値のアルゴリズム

Posted: 2011年6月02日(木) 18:46
by 初級者
2個以上の数値が等しい場合は考えなくていいんですか?

Re: 中央値のアルゴリズム

Posted: 2011年6月02日(木) 19:07
by 初級者
a が b と c の間にあることをより直感的に示すため、私だったらこんな風に書きます。

コード:

    if ((c <= a && a <= b) ¦¦ (b <= a && a <= c)) return a;

Re: 中央値のアルゴリズム

Posted: 2011年6月02日(木) 19:34
by a5ua
効率的ではありませんが、参考までに

コード:

int med(int a, int b, int c)
{
	if (b < a) return med(b, a, c);
	if (c < b) return med(a, c, b);
	return b;
}

Re: 中央値のアルゴリズム

Posted: 2011年6月03日(金) 12:49
by ゆーずぃ
アルゴリズムとは関係ない個人的趣向ですが、エラー処理以外はあちこちでリターンさせたくないのでこっちの方が好きですw

コード:

int med(int a,int b, int c)
{
 int ret = c;
 if (a < b && a > c || a > b && a < c) { ret = a; }
 if (b < a && b > c || b > a && b < c) { ret = b; } 
return ret;
}

Re: 中央値のアルゴリズム

Posted: 2011年6月03日(金) 14:52
by かずま
何を返すにしても、比較は最大 3回で十分です。

コード:

int med(int a, int b, int c)
{
    return (a < b) ? (b < c) ? b : (a < c) ? c : a
                   : (a < c) ? a : (b < c) ? c : b;
}