1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
コース一覧
アルゴリズム道場 カメ師範の十の巻
第五の巻 整列の途中経過

アルゴリズム道場 カメ師範の十の巻

言語を問わず、考え方だけを問う演習専用コースです。解説はありません。巻物と完成条件だけを読み、白紙から自分で組み立てます。Python・JavaScript・TypeScript・Java のどれで解いても構いません。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。総和と最大から始まり、線形探索、整列、二分探索、再帰、スタックとキューを経て、最後は初見の疑似コードを読み解いて実装するところまで、10問でアルゴリズムの基礎を一巡します。1問15分から45分、全10問で約5時間です。いずれかの言語の入門を終えて「動くものは書けるが、考え方に自信がない」と感じている方に向いています。

1
初段
01. 第一の巻 総和と最大15分
02. 第二の巻 線形探索15分
03. 第三の巻 バブルソート20分
04. 第四の巻 二分探索25分
2
中段
01. 第五の巻 整列の途中経過25分
02. 第六の巻 再帰25分
03. 第七の巻 スタックを作れ30分
04. 第八の巻 キューを作れ30分
3
師範
01. 第九の巻 計算量を体感せよ35分
02. 免許皆伝 初見の巻物45分

第五の巻 整列の途中経過

中段 / 目安 25分

五つめの巻物を開きながら、師範が言います。「今度は、動かした結果だけを見せてもらっても困る。整列の途中で何が起きておるのか——1周ごとに何が確定するのかを、お前が説明できるかどうかじゃ」

題材は選択ソートです。第三の巻の泡の技とは、確定していく場所が違います。

選択ソートの1周は、こうです。まだ確定していない範囲の中から最小の値を探し、その範囲の先頭と入れ替える。 1周終えると先頭の1つが確定します。2周終えると先頭から2つ。3周終えると先頭から3つです。

師範が求めているのは、その3周目が終わった瞬間の並びです。並べ終えた姿ではありません。途中で止まった姿です。

完成条件

売上高の配列を受け取り、選択ソートを3周だけ回した時点の並びをカンマ区切りの文字列にして返す関数 selectionAfterThree を作ってください。どの言語で解く場合も、関数名は selectionAfterThree にしてください。

例えば 520,180,340,760,290,410,150,630 を受け取ったときの答えは、次のようになります。

プレーンテキスト

150,180,290,760,340,410,520,630

先頭の3つ 150,180,290 は確定した最小の3つです。4つめより後ろは、入れ替えの跳ね返りで元の順序が崩れています。そこを「まだ並んでいない」ときちんと言えるかどうかが、この巻物の要です。

  • 区切りは半角カンマ1つだけ。カンマの前後にスペースを入れないこと
  • 入力の配列には必ず4つ以上の要素が入っています
  • 3周より多く回してはいけません。並べ終えた結果を返すと不合格です

禁じ手

第三の巻と同じく、sorted sort Arrays.sort などの並べ替えの道具は使えません。

進め方

白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

書き始める前に、例の並びを紙の上で3周ぶん手で追ってください。1周目に 150 がどこから来て、520 がどこへ行ったか。それが追えていれば、コードは短く済みます。

要件

  1. 関数名は selectionAfterThree。どの言語で解く場合も同じ名前にすること
  2. 選択ソート(未確定の範囲から最小を探し、その範囲の先頭と入れ替える)で書くこと
  3. 外側のループは3周だけ回すこと。最後まで並べ終えないこと
  4. sorted / sort / Arrays.sort などの並べ替えの道具を使わないこと
  5. 結果は半角カンマ区切りの文字列にすること。印字ではなく return で返す

入出力例

selectionAfterThree([520,180,340,760,290,410,150,630]) → "150,180,290,760,340,410,520,630" selectionAfterThree([300,100,200,500,400]) → "100,200,300,500,400" selectionAfterThree([90,80,70,60,50,40]) → "40,50,60,70,80,90" selectionAfterThree([110,220,330,440]) → "110,220,330,440" selectionAfterThree([250,250,90,480,90,700]) → "90,90,250,480,250,700"

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 外側のループを3回だけ回します。i 周目では、i 番目から末尾までの範囲を見て最小の値がどこにあるかを覚え、その値と i 番目を入れ替えます。3回終えたところで並びを文字列にします

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/09

関連レッスン

  • 第六の巻 再帰

    自分を呼ぶ関数を書きます。止まる条件を先に決めるのが要です。

  • 第七の巻 スタックを作れ

    後から入れたものが先に出る器を、配列だけで作ります。

  • 第八の巻 キューを作れ

    先に並んだ者が先に出る器を作ります。スタックとの違いを言葉にします。

  • 第九の巻 計算量を体感せよ

    同じ答えを出す2つのやり方で、比べた回数がどれだけ違うかを数えます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 整列揃え方を統一して情報の流れを作る
  • 選択ソート未ソート部分から最小値を見つけて先頭に移動する操作を繰り返す。
  • 配列サイズ固定の同型データの集まり
  • 関数処理に名前を付けて再利用できる単位
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
main.py
学習モード
エディタを読み込んでいます

メモ

第五の巻 整列の途中経過

⌘S で保存