ソートのアルゴリズム|つまづきやすいポイントと攻略法 徹底解説!
この連載は、基本情報技術者試験の受験者を対象としたものです。
毎回1つのテーマにしぼって、多くの受験者がつまづきやすいポイントと攻略法を解説します。
今回のテーマはソートのアルゴリズムです。
ソートのアルゴリズムの種類
ソート(sort)とは、配列を昇順(小さい順)や降順(大きい順)に整列することです。
基本情報技術者試験の知識と技能の細目を示したシラバスという資料には、ソートのアルゴリズムとして、選択ソート、バブルソート、マージソート、挿入ソート、シェルソート、クイックソート、ヒープソートが示されています。
科目Aには、これらのアルゴリズムの名称と処理内容の説明文を対応付ける問題が出ます。
科目Bには、これらのアルゴリズムを擬似言語で示したプログラムを読み取る問題が出ます。
したがって、ソートのアルゴリズムに関する問題を攻略するには、それぞれのアルゴリズムを理解することはもちろんですが、それぞれのアルゴリズムをプログラムで経験することも必要です。
ソートのアルゴリズムは、それらをプログラムにしたときの仕組みから、以下のように分類できます。
多重ループとは、繰り返し処理の中で別の繰り返し処理を行うことです。
再帰呼び出しとは、関数(または手続)の中で同じ関数(または手続)を呼び出すことで繰り返し処理を実現することです。
シェルソートは、挿入ソートを改良したアルゴリズムです。
【多重ループを使うアルゴリズム】
選択ソート、バブルソート、挿入ソート
【再帰呼び出しを使うアルゴリズム】
マージソート、クイックソート、ヒープソート
【他のアルゴリズムを改良したアルゴリズム】
シェルソート(挿入ソートを改良したもの)
アルゴリズムを理解するには、手作業でやってみるとよいでしょう。
教材(受験者であれば何らかの教材をお持ちでしょう)でアルゴリズムの説明を読んだら、カードに数字を書いたものを配列の要素に見立てて、手作業でソートしてみるのです。
これで、科目Aの問題が解けるようになります。
アルゴリズムを十分に理解できたら、それをプログラムで経験してください。
擬似言語では、プログラムを動作させられないので、JavaやPythonなどのプログラミング言語を使ってください。
インターネットを「Java クイックソート」や「Python クイックソート」のようにプログラミング言語とアルゴリズムの名称をスペースで区切って検索すれば、実際に動作するプログラムを紹介しているページがいくつか見つかりますので、それらを参考にしてプログラムを作って動作を確認してください。
これで、科目Bの問題が解けるようになります。
選択ソート、バブルソート、マージソート、挿入ソート、シェルソート、クイックソート、ヒープソートのすべてを理解し、それらをプログラムとして経験するには、かなりの時間がかかるでしょう。
ただし、この経験によって、プログラミングやアルゴリズムの理解が一気に深まり、苦手意識が一気に解消するはずです。
基本情報技術者試験に合格したいなら、がんばって取り組んでください。
ソートのアルゴリズムに関する科目Aの問題の例
ソートのアルゴリズムをテーマとした科目Aと科目Bの問題を見てみましょう。
手作業でアルゴリズムを理解していれば科目Aの問題は解けますが、プログラムを経験していないと科目Bの問題は解けないことがわかるはずです。
以下は、クイックソートをテーマとした科目Aの問題(出典:H30秋問6)です。
問題1(出典:H30秋問6)
クイックソートの処理方法を説明したものはどれか。
ア 既に整列済みのデータ列の正しい位置に,データを追加する操作を繰り返していく方法である。
イ データ中の最小値を求め,次にそれを除いた部分の中から最小値を求める。この操作を繰り返していく方法である。
ウ 適当な基準値を選び,それよりも小さな値のグループと大きな値のグループにデータを分割する。同様にして,グループの中で基準値を選び,それぞれのグループを分割する。この操作を繰り返していく方法である。
エ 隣り合ったデータの比較と入替えを繰り返すことによって,小さな値のデータを次第に端の方に移していく方法である。
手作業でソートのアルゴリズムを経験していれば、それぞれの選択肢が何というアルゴリズムの説明であるかがわかるでしょう。
「整列済みのデータ列にデータを追加する」ということから、選択肢アは挿入ソートです。
「最小値を求めることを繰り返す」ということから、選択肢イは選択ソートです。
「基準値より小さなグループと大きなグループに分割する」ということから、選択肢ウはクイックソートです。
「隣り合ったデータの比較と入れ替えを繰り返す」ということから、選択肢エはバブルソートです。
したがって、選択肢ウが正解です。
ソートのアルゴリズムに関する科目Bの問題の例
以下は、クイックソートをテーマとした科目Bの問題(出典:R05公開問3)です。
問題2(出典:R05公開問3)
次の記述中の に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。
次の手続 sort は,大域の整数型の配列 data の,引数 first で与えられた要素番号から引数 last で与えられた要素番号までの要素を昇順に整列する。ここで,first < last とする。手続 sort を sort(1, 5) として呼び出すと,/*** α ***/ の行を最初に実行したときの出力は “ ” となる。
解答群
ア 1 2 3 4 5
イ 1 2 3 5 4
ウ 2 1 3 4 5
エ 2 1 3 5 4
この問題には、ソートのプログラムであることは示されていますが、何というアルゴリズムであることかは示されていません。
ただし、ソートのアルゴリズムをプログラムで経験していれば、クイックソートだとわかるはずです。
ポイントとなるのは、 pivot という名前の変数を使っていることと、再帰呼び出しを使っていることです。
クイックソートでは、配列の中から基準値を選んで、残りの要素を基準値より小さいグループと大きいグループに分割することを繰り返します。
クイックソートのプログラムでは、基準値を格納する変数の名前を pivot とするのが一般的です。
また、分割の繰り返しは、while文やfor文ではなく、再帰呼び出しを使うのが一般的です。
このプログラムには、手続 sort の処理の中で手続 sort を呼び出している部分がありますが、それが再帰呼び出しです。
クイックソートだとわかれば、プログラムを隅々まで読み取る必要はありません。
{2, 1, 3, 5, 4}という配列が、1回目の繰り返し処理の後で、どのようにグループ分けされるかを答える問題なので、基準値をどのように決めているのかを読み取れれば、選択肢の中から正解を選べます。
「pivot ← data[(first + last)÷2の商]」という処理で基準値を変数pivotに代入しています。
1回目の繰り返し処理では、first=1、last=5なので「pivot ← data[(1 + 5)÷2の商]」であり、pivotは3になります。
{2, 1, 3, 5, 4}という配列は、3を基準値にすると、既にグループ分けができています(既に、3の前に3より小さい値があり、3の後に3より大きい値がある状態になっている)。
したがって、1回目の繰り返し処理の後では、{2, 1, 3, 5, 4}は{2, 1, 3, 5, 4}のままであり、選択肢エが正解です。
今回は、「ソートのアルゴリズム」のポイントと攻略法を解説しました。
このテーマが苦手だった受験者の参考になれば幸いです。
それでは、またお会いしましょう!
label 関連タグ免除試験を受けた 74.9% の方が、科目A免除資格を得ています。
※独習ゼミは、受験ナビ運営のSEプラスによる試験対策eラーニングです。
ソートのアルゴリズム|つまづきやすいポイントと攻略法 徹底解説!
update
再帰呼び出し|つまづきやすいポイントと攻略法 徹底解説!
update
モジュール結合度|つまづきやすいポイントと攻略法 徹底解説!
update
RAID|つまづきやすいポイントと攻略法 徹底解説!
update
MIPS|つまづきやすいポイントと攻略法 徹底解説!
update
暗号化|つまづきやすいポイントと攻略法 徹底解説!
update
IPアドレス|つまづきやすいポイントと攻略法 徹底解説!
update
ネットワークの識別番号|つまづきやすいポイントと攻略法 徹底解説!
update
OSI基本参照モデル|つまづきやすいポイントと攻略法 徹底解説!
update
関係データベースの正規化|つまづきやすいポイントと攻略法 徹底解説!
update
『プログラムはなぜ動くのか』(日経BP)が大ベストセラー
IT技術を楽しく・分かりやすく教える“自称ソフトウェア芸人”
大手電気メーカーでPCの製造、ソフトハウスでプログラマを経験。独立後、現在はアプリケーションの開発と販売に従事。その傍ら、書籍・雑誌の執筆、またセミナー講師として活躍。軽快な口調で、知識0ベースのITエンジニアや一般書店フェアなどの一般的なPCユーザの講習ではダントツの評価。
お客様の満足を何よりも大切にし、わかりやすい、のせるのが上手い自称ソフトウェア芸人。
主な著作物
- 「プログラムはなぜ動くのか」(日経BP)
- 「コンピュータはなぜ動くのか」(日経BP)
- 「出るとこだけ! 基本情報技術者」 (翔泳社)
- 「ベテランが丁寧に教えてくれる ハードウェアの知識と実務」(翔泳社)
- 「ifとelseの思考術」(ソフトバンククリエイティブ) など多数







