クイックソートのアルゴリズム|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
基本情報技術者試験は、 2023 年 4 月から新制度で実施されています。
この連載では、新制度で採用された新しい擬似言語(旧制度の擬似言語とは、表記方法に違いがあります)を使って、試験のシラバス(情報処理技術者試験における知識・技能の細目)に示されている代表的なアルゴリズムとデータ構造を、プログラミング入門者向けにやさしく解説します。 受験対策としてだけでなく、アルゴリズムとプログラミングの基礎知識を習得するために、ぜひお読みください。
前回は 再帰呼び出し を取り上げました。 今回は、再帰呼び出しを使った クイックソート を取り上げます。
クイックソートのアルゴリズム
クイックソートは、配列をソートするアルゴリズムの一種です。 クイックソートのアルゴリズムは以下です。
format_quote
配列の中から基準値を選び、残りの要素を基準値より小さいグループと大きいグループに分けることを、グループの要素数が 1 個になるまで( 2 個以上である限り)繰り返す
format_quote
グループ分けすることでソートの対象となる配列の要素数が徐々に少なくなることと、プログラムで繰り返しを実現するときに再帰呼び出し(関数や手続の処理の中で、同じ関数や手続を呼び出すことで、繰り返しを実現するプログラミング技法)を使うことが、クイックソートの特徴です。
図 1 は、要素数 7 個の配列(要素番号は 1 から始まるとします)を昇順にクイックソートする手順の例を示したものです。
ここでは、ソート対象となる配列の真ん中の要素を基準値としています。
真ん中の要素の要素番号は、
(左端の要素の要素番号 + 右端の要素の要素番号) ÷ 2
という計算で求められます。 要素番号は、整数型のデータなので、除算結果の小数点以下はカットされます。
初期状態(図 1 の【手順 1 】)では、ソート対象となる配列が a[1] ~ a[7] なので、
(1 + 7) ÷ 2 = 4
となり、 a[4] に格納されている 4 が基準値です。
配列の先頭から基準値より大きい値を探索し、配列の末尾から基準値より小さい値を探索して、大きい値と小さい値を交換することを繰り返すと、基準値との大小関係で配列のグループ分けができます。
同じ手順を、グループ分けしたそれぞれのグループで繰り返します。 グループの要素数が 1 個になったら繰り返しを終了します。 すべてのグループの繰り返しが終了したら、配列全体のソートが完了します。
クイックソートのプログラム
リスト 1 は、クイックソートのプログラムの例です。
これは、 2023 年 7 月 6 日に情報処理推進機構から公開された「令和 5 年度 基本情報技術者試験 科目 B 公開問題」の問 3 に示されたプログラムに、若干のアレンジを加えたものです。
手続 sort は、配列を昇順にクイックソートします。
引数 a は、ソート対象の配列です。
引数 first は、ソート対象の先頭の要素番号です。
引数 last は、ソート対象の末尾の要素番号です。
配列の要素番号は、 1 から始まるとします。
swipeプログラムは横スクロールできます