C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で配列の最小値・最大値を求めるプログラムを徹底解説

この記事では、n個の整数からなる配列 arr[] が与えられたとき、その中から最小値と最大値を見つけるC++プログラムの作成方法を解説します。

問題の概要

ここでは、n個の整数値を含む配列 arr[] が与えられます。配列内のすべての値の中から、最大値と最小値を求めることが課題です。

具体例で問題を確認しましょう。

入力

arr[] = {2, 1, 6, 9, 4, 10, 15, 21}

出力

max = 21 , min = 1

解法アプローチ

この問題には複数の解き方があります。まず基本となるのは、配列の要素同士を直接比較する方法です。各要素を順番に確認しながら、比較によって最大値と最小値を求めていきます。

比較による解法には、次の2つのアプローチがあります。

  • 反復処理(ループ)を使う方法
  • 再帰呼び出しを使う方法

方法1:反復処理による解法

配列をループで走査し、各要素を取り出して現在の最大値・最小値と比較していきます。初期値として配列の先頭要素を設定し、より大きい値が見つかれば最大値を、より小さい値が見つかれば最小値を更新します。

この解法の動作を示すプログラムは以下の通りです。

サンプルコード

#include <iostream>
using namespace std;

void getMinMax(int arr[], int N) {
    int max = arr[0], min = arr[0];
    for(int i = 1; i < N; i++) {
        if(max < arr[i])
            max = arr[i];
        if(min > arr[i])
            min = arr[i];
    }
    cout << "Maximum Value = " << max << "\n";
    cout << "Minimum Value = " << min;
}

int main() {
    int arr[] = {2, 1, 6, 9, 4, 10, 15, 21};
    int N = 8;
    getMinMax(arr, N);
    return 0;
}

実行結果

Maximum Value = 21
Minimum Value = 1

この方法の計算量は O(N) で、配列を一度だけ走査すればよいため非常に効率的です。

方法2:再帰処理による解法

このアプローチでは、配列の末尾の要素と、それ以外の部分配列に対する再帰呼び出しの結果を比較することで、全体の最大値・最小値を求めます。要素数が1になった時点で再帰を終了するのがポイントです。

この解法の動作を示すプログラムは以下の通りです。

サンプルコード

#include <iostream>
using namespace std;

int CalcMinValue(int arr[], int n) {
    return (n == 1) ? arr[0] : min(arr[n - 1], CalcMinValue(arr, n - 1));
}

int CalcMaxValue(int arr[], int n) {
    return (n == 1) ? arr[0] : max(arr[n - 1], CalcMaxValue(arr, n - 1));
}

int main() {
    int arr[] = {2, 1, 6, 9, 4, 10, 15, 21};
    int N = 8;
    cout << "Maximum Value = " << CalcMaxValue(arr, N) << endl;
    cout << "Minimum Value = " << CalcMinValue(arr, N);
    return 0;
}

実行結果

Maximum Value = 21
Minimum Value = 1

なお、再帰版の CalcMaxValue 内では同じ再帰関数 CalcMaxValue を呼び出す点に注意してください。誤って CalcMinValue を呼び出すと正しい最大値が得られません。

方法3:STLの組み込み関数を使う解法

C++の標準テンプレートライブラリ(STL)には、最大値・最小値を簡単に求められる便利な関数が用意されています。

使用するのは min_element()max_element() です。これらは <bits/stdc++.h>(または <algorithm>)ヘッダに含まれており、イテレータの範囲を指定すると、その範囲内の最小・最大要素へのポインタ(イテレータ)を返します。値そのものを取得するには、*(間接参照演算子)を使います。

この解法を示すプログラムは以下の通りです。

サンプルコード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int arr[] = {2, 1, 6, 9, 4, 10, 15, 21};
    int N = 8;
    cout << "Maximum Value = " << (*max_element(arr, arr + N)) << endl;
    cout << "Minimum Value = " << (*min_element(arr, arr + N));
    return 0;
}

実行結果

Maximum Value = 21
Minimum Value = 1

まとめ

C++で配列の最大値・最小値を求める方法として、以下の3つを紹介しました。

  • 反復処理: ループで全要素を比較する最も基本的な方法(計算量 O(N))
  • 再帰処理: 関数の再帰呼び出しで解くエレガントな方法
  • STL関数: min_element() / max_element() を使った簡潔な方法

実務や競技プログラミングでは、コードが短く可読性の高いSTL関数を使うのがおすすめですが、アルゴリズムの学習としては反復処理や再帰処理での実装もぜひ理解しておきましょう。

  1. PHPで配列内の最小値を求めるプログラムの書き方【サンプルコード付き】

    配列の中から最小の要素(最小値)を取り出すPHPコードは、以下の通りです。サンプルコード<?php    function get_min_value($my_array){        $n = count($my_array);        $min_val = $my_array[0];        

  2. C#で配列内の最大要素と最小要素を見つける方法

    C#で配列の中から最大値と最小値を求めるには、まず配列の最初の要素を最大値・最小値の初期値として設定し、残りの要素と順番に比較していくのが基本的なアプローチです。 考え方 変数 max と min に、それぞれ配列の先頭要素(arr[0])を代入しておきます。その後、2番目以降の要素を1つずつ取り出しながら、以下のように比較を行います。 最大値を求める場合 現在の要素が max より大きければ、その値で max を更新します。 max) { max = arr[i]; } 最小値を求める場合 現在の要素が min より小さければ、その値で min を更新します。 if(arr[i]