【科目B対策】配列から「最大値の位置(添字)」を求めるアルゴリズム

前回は、配列の中から 最大値そのもの を求めるアルゴリズムを学びました。

科目Bでは、次の段階として非常によく出るのが

最大値が「どこにあるか」

つまり、最大値の位置(添字)を求める処理です。


なぜ「位置」を求める必要があるのか?

実務でも試験でも、次のような場面があります。

  • 最大値の要素を 別の要素と入れ替えたい
  • 最大値を 削除・更新したい
  • ソート(並び替え)の途中で 最大要素を確定させたい

このとき、

値だけ分かっても意味がなく、位置(添字)が必要になります。


配列の準備(例)

A ← [ 7, 3, 9, 4, 6 ]
N ← LENGTH(A)

配列の中身と添字は次の通りです。

  • A[1] = 7
  • A[2] = 3
  • A[3] = 9
  • A[4] = 4
  • A[5] = 6

基本方針(ここが重要)

考え方は 最大値探索とほぼ同じです。

ただし今回は、

  • 最大値そのもの → MAX
  • 最大値の位置 → MAX_POS

この 2つをセットで管理します。


科目B風 擬似コード

MAX ← A[1]
MAX_POS ← 1

for i ← 2 to N
  if A[i] > MAX then
    MAX ← A[i]
    MAX_POS ← i
  endif
endfor

処理を日本語で説明すると

  1. 最初の要素 A[1] を最大値とする
  2. 同時に、その位置として MAX_POS ← 1 を記録
  3. 2番目以降の要素を順に比較
  4. より大きい値が見つかったら
    • 最大値を更新
    • その位置(i)も更新
  5. ループ終了後、MAX_POS に最大値の添字が入る

実際の動きを追ってみる

iA[i]MAXMAX_POS
初期771
2371
3993
4493
5693

👉 最大値 9 は A[3] にある


初学者がつまずきやすいポイント(重要)

❌ 位置を更新し忘れる

MAX ← A[i]

だけ書いて、

MAX_POS ← i

を書き忘れるケース。

試験では致命傷です。


❌ MAX_POS を 0 で初期化する

MAX_POS ← 0

→ 科目Bの擬似コードでは

添字は 1 から始まる前提です。


❌ i を 1 から回してしまう

for i ← 1 to N

→ 初期値 A[1] と自分自身を比較してしまう

(論理的に破綻はしないが、美しくない)


科目Bでの典型的な出題パターン

このアルゴリズムは、次の形でよく出ます。

  • 「処理終了後、MAX_POS の値はいくつか」
  • 「A[i] > MAX の条件を ≥ に変えるとどうなるか」
  • 「最大値が複数ある場合、どれが選ばれるか」

👉 条件式の意味を読ませる問題が非常に多いです。


次につながる重要ポイント

最大値の位置が分かると、次ができます。

  • 最大値と末尾要素の 入れ替え
  • 選択ソート(Selection Sort)
  • 最大値を確定させるアルゴリズム

つまり、

ここが「ソート系アルゴリズム」の入口

です。


まとめ

  • 科目Bでは「値」より「位置」が重要になる
  • 最大値と最大値の位置は 必ずセットで管理
  • この考え方がソート・探索に直結する

訪問数 3 回, 今日の訪問数 3回