配列から最大値(最小値)を探す | Programming Place Plus C言語編 逆引き

トップページC言語編逆引き

このページの概要

以下は目次です。

目的

配列の中から、もっとも大きい値(またはもっとも小さい値)を探したいとします。

方法①(単純なアルゴリズム)

都合の良い前提条件がない限り、基本的に、先頭の要素から順に1つずつ調べるしかありません。 (前提条件の例として、方法②を参照してください)。

#include <assert.h>
#include <stdio.h>

#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))

int max_element(const int* array, size_t size)
{
    assert(array != NULL);
    assert(size >= 1);

    int max = array[0];
    for (size_t i = 1; i < size; ++i) {
        if (max < array[i]) {
            max = array[i];
        }
    }

    return max;
}

int min_element(const int* array, size_t size)
{
    assert(array != NULL);
    assert(size >= 1);

    int min = array[0];
    for (size_t i = 1; i < size; ++i) {
        if (min > array[i]) {
            min = array[i];
        }
    }

    return min;
}

int main(void)
{
    const int array[] = {9, -4, 6, -2, 10, 7, -1};

    printf("max: %d\n", max_element(array, SIZE_OF_ARRAY(array)));
    printf("min: %d\n", min_element(array, SIZE_OF_ARRAY(array)));
}

実行結果:

max: 10
min: -4

配列の要素の値を先頭から順番に調べていき、 各段階においての最大値(最小値)を、作業用の変数に取っておきます。 より大きな値(小さな値)が現れたら、その値で更新します。

最大値(最小値)の初期値だけは注意が必要です。 何らかの適切な初期値を与えないと、array[0] と不定値との比較になってしまい、 正しい判定が行えません。
ここでは array[0] を初期値として使い、変数i は 1 から開始するようにしています。

あるいは、INT_MININT_MAX のように、これより大きい(小さい)値があり得ない値を使う方法もあります。 たとえば、次のようになります。

max = INT_MIN;  // 最大値の変数を、可能性のある最小の値で初期化
for (size_t i = 0; i < size; ++i) {
    if (max < array[i]) {
        max = array[i];
    }
}

方法②(ソートされた状態を利用する)

配列がソートされているのなら、先頭要素が最小値か最大値になっているはずなので、 先頭要素を取得するだけで済みます。

そのため、配列を書き換えてしまっても良いのなら、効率面の問題もありますが、ソートしてしまうことも1つの方法ではあります。配列をソートする方法は、「逆引き 配列をソートする」で扱っているので、そちらを参照してください。


参考リンク


更新履歴

’2017/6/14 新規作成。



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る