アルゴリズム1

◆ 挿入ソート

 ソート対象の配列を、先頭から1つずつデータを読み取り、その読み取ったデータを適切な場所に挿入していくやり方です。
 文章だけでは分からないので、例で。

8 7 12 2 5 9 18 13 21 3 10 6

 左からデータを比較していきます。まずは「8」。比較対象はないので、そのままソート済みデータにします。

8 7 12 2 5 9 18 13 21 3 10 6

 次は「7」。「8」より小さいので「8」の前に挿入します。そしてソート済みデータにします。

7 8 12 2 5 9 18 13 21 3 10 6

 少し飛ばして「2」の所まで来たとします。一番小さいので一番前に挿入します。

2 7 8 12 5 9 18 13 21 3 10 6

 こんな感じで、配列のデータを1つずつ抜き取り、適切な場所にデータを挿入してソート済みデータとしてしまうやり方を挿入ソートと言います。
 特徴として、ある程度ソートされたデータだとソート速度が速くなるらしく、シェルソートなどでも使われtれいます。


◆ ヒープソート(ヒープ木)

 情報構造の箇所でも記述しましたけど、ヒープソートとはポインタ領域とか不要で配列のみでソート可能なアルゴリズムです。 「添字」とか出てましたけど、ただの配列の番号なので、あまり気にすることではないと思います。 図は太字が「添字」。いわゆる配列の順番を意味しています。
 ヒープソートのアルゴリズムとは、データをヒープ構造化して、根のデータを取り出す。 そして残ったデータでまたヒープ構造化する。そして根のデータを取り出す  ・・・・をデータがなくなるまで繰り返します。
 と文章で書いても分からないので、下の様にデータがあったとします。

8 7 12 2 5 9 18 13 21 3 10 6


 これをヒープ木にすると、右の様になると思います。
 ヒープ木とは親と子ノードが上下関係になるように要素を入れ替えるようにします。 配列Nのデータ N[a] と N[2a]、N[a] と N[2a+1] を比較すると書いてますけど、 右の図を見て分かるとおり、親ノードとそれにぶら下がっている子ノードを比較する事を言っています。 (子ノードがない場合は、そのままにしておきます。) ソートの条件によると思いますけど、ここでは root が最大値になるように入れ替えていきます。
 比較の仕方は左の図みたいにします。 要は、親と子を比較して親が大きくなるように要素を入れ替えします。
 この入れ替え作業を、葉の方から順に行い、root まで行います。 そして最終的に大小関係に矛盾がなくなるまで繰り返すと、右の図様になると思います。

 このあと、root の「21」の要素を取り出し、整列済みの配列(新しい配列として作成します)に追加します。 そして今度は「21」のデータの抜けた配列でヒープ木を作る事になります。

13 18 8 10 9 12 7 2 3 4 6

 これをまたヒープ木にして、root に最大値が来るように入れ替え処理を行います。


 これを繰り返して、上記の配列のデータがなくなるまで繰り返します。

 出題傾向は、午後の方にアルゴリズムで問われるか、午前は意味的なものを問われる事が多いようです。  ちなみに計算量は O ( n log2 n )です。

◆ シェルソート

 シェルソートとは、ある一定の間隔で離れたデータを比較して、そのデータ郡を比較しソート(入れ替え)処理を行います。 ソート処理が終わったら、一定の間隔の幅を狭めてデータを比較して、またソート処理を行います。 これを繰り返し行い、最終的に幅が1になったら挿入ソートでソート処理を行います。
 以下が例です。
 まずは幅を3つとしましょう。同じ色のブロックでソートして入れ替え処理をやっていると思ってください。

8 27 12 2 5 9 18 15 21 3 10 6
  →  
2 5 6 3 10 9 8 15 12 18 27 21

 次に幅を2つに狭めます。

2 5 6 3 10 9 8 15 12 18 27 21
  →  
2 3 6 5 8 9 10 15 12 18 27 21

 ある程度ソートされてきている事が分かります。
 最後は幅が1つになってので、挿入ソートで処理します。

2 5 6 3 10 9 8 15 12 18 27 21
  →  
2 3 5 6 8 9 10 12 15 18 21 27

 以上のやり方がシェルソートです。
 ちなみに計算量は O ( n 0 ^ 1.25 )程度だそうです。  過去問題では、意味を問うものが多いです。
 ソート処理自体とはあまり関係ないと思いますが、下の過去問題は何回か出てきています。

 データ列 7, 2, 8, 3, 1, 9, 4, 5, 6 を手順 (1) 〜 (4) に従って整列する時、手順 (3) は何回繰り返して完了するか?
 []は小数点以下を切り捨てた結果を表す。

(1) [データ数]÷3 → H
(2) データ列をお互いにH要素分だけ離れた要素の集まりからなる部分列として、それぞれを挿入法を用いて整列する。
(3) [H]÷3 → H
(4) Hが 0 であればデータ列の整列を完了し、0 でなければ (2) に戻る。


 まず、順番にやりましょう。
(1) で、データ数は 9 なので、Hは 3 なります。
(2) でソート処理が入りますけど、問題とあまり関係ないので無視します。
(3) で 3 ÷ 3 でHは 1 になります。◎(1回実行)
(4) でHは 1 なので (2) に戻ります。
(2) は同じように無視します。
(3) で 1 ÷ 3 でHは 0.333・・・ になります。更に小数点以下切捨てなので Hは 0 。◎(2回実行)
(4) でHは 0 なので処理終了。

 というわけで計2回となります。


TOPページに戻る