C言語

【C言語】第3章第12回:配列内の最大値・最小値を探すアルゴリズム

配列内の最大値と最小値を探すアルゴリズムは、基本的かつ実用的なスキルです。この章では、線形探索を用いて最大値・最小値を見つける方法を解説します。

1. 配列内の最大値・最小値を探す基本アルゴリズム

最大値・最小値を探すためには、配列の各要素を順番に比較します。

アルゴリズムの基本的な流れ:

  1. 最初の要素を最大値と最小値として初期化する。
  2. 配列の他の要素をループで走査し、条件に応じて最大値または最小値を更新する。
  3. すべての要素を確認した後、最大値と最小値を出力する。

2. 最大値と最小値を探すプログラム例

例:配列内の最大値と最小値を探すプログラム

#include <stdio.h>

int main() {
    int numbers[] = {3, 15, 7, 2, 20, 11};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int max = numbers[0];
    int min = numbers[0];

    for (int i = 1; i < size; i++) {
        if (numbers[i] > max) {
            max = numbers[i];
        }
        if (numbers[i] < min) {
            min = numbers[i];
        }
    }

    printf("Maximum value: %d\n", max);
    printf("Minimum value: %d\n", min);

    return 0;
}

解説:

  • maxminを配列の最初の要素で初期化。
  • forループで配列の各要素を走査し、条件に応じて値を更新。
  • 最大値と最小値を出力。

3. ユーザー入力を利用した拡張例

ユーザーが配列の要素を入力し、その中から最大値と最小値を探します。

例:ユーザー入力を利用したプログラム

#include <stdio.h>

int main() {
    int n;

    printf("Enter the number of elements: ");
    scanf("%d", &n);

    int numbers[n];

    printf("Enter %d elements:\n", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    int max = numbers[0];
    int min = numbers[0];

    for (int i = 1; i < n; i++) {
        if (numbers[i] > max) {
            max = numbers[i];
        }
        if (numbers[i] < min) {
            min = numbers[i];
        }
    }

    printf("Maximum value: %d\n", max);
    printf("Minimum value: %d\n", min);

    return 0;
}

解説:

  • 配列のサイズをユーザーから入力させます。
  • forループを使い、配列の各要素をユーザー入力で初期化。
  • 最大値と最小値を計算し、結果を出力します。

4. 最大値・最小値の位置を取得する

最大値と最小値のインデックスを取得する方法を示します。

例:位置情報を取得するプログラム

#include <stdio.h>

int main() {
    int numbers[] = {3, 15, 7, 2, 20, 11};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int max = numbers[0], min = numbers[0];
    int maxIndex = 0, minIndex = 0;

    for (int i = 1; i < size; i++) {
        if (numbers[i] > max) {
            max = numbers[i];
            maxIndex = i;
        }
        if (numbers[i] < min) {
            min = numbers[i];
            minIndex = i;
        }
    }

    printf("Maximum value: %d at index %d\n", max, maxIndex);
    printf("Minimum value: %d at index %d\n", min, minIndex);

    return 0;
}

解説:

  • 最大値と最小値が更新されるたびに、対応するインデックスも更新します。
  • 計算結果として、値とその位置を同時に取得できます。

5. 練習問題

以下の課題に挑戦して、配列操作とアルゴリズムの理解を深めましょう。

  1. 配列の要素をユーザーが入力し、その最大値と最小値の差を計算するプログラムを作成してください。
  2. 複数の配列を比較し、それぞれの配列での最大値を出力するプログラムを作成してください。
  3. 2次元配列の中で最大値と最小値を探すプログラムを作成してください。

6. 練習問題の解答と解説

問1の解答

#include <stdio.h>

int main() {
    int n;

    printf("Enter the number of elements: ");
    scanf("%d", &n);

    int numbers[n];

    printf("Enter %d elements:\n", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    int max = numbers[0];
    int min = numbers[0];

    for (int i = 1; i < n; i++) {
        if (numbers[i] > max) {
            max = numbers[i];
        }
        if (numbers[i] < min) {
            min = numbers[i];
        }
    }

    printf("Difference between max and min: %d\n", max - min);

    return 0;
}

7. まとめ

配列の最大値と最小値を探すアルゴリズムは、多くの場面で役立ちます。この基本的なスキルを応用して、より高度なプログラムを作成してみましょう。