単純挿入ソートは,
a[0]から
a[i-1]まで並び替えが終わって
いるとき,
a[i]を正しい位置に入れる--ことを繰り返す方法である.その様子を図
20に示す.処理の手順は次の通りである.
- 処理するa[i]の値35よりも,48は大きいので35の場所へ移動させる.
- 次の44も35より大きいので,48の場所へ移動させる.
- 次の41も35より大きいので,44の場所へ移動させる.
- 次の39も35より大きいので,41の場所へ移動させる.
- 次の32は35より小さいので,それは移動させない.そして,元の35を39の場所へ
移動させる.
図 20:
単純挿入ソートの基本操作.a[i]を正しい位置に入れる.
|
単純挿入ソートの実際のプログラム(関数)は,教科書 [
1]p.219のリスト
6.20のように書く.整列させる整数のデータは,配列は
array[]に格納されている.
データの個数は
numに格納されている.したがって,整列すべき整数のデータは,配
列の
array[0]〜
array[num-1]に格納されている.
この関数がソートする様子を図21に示す.先に示したアルゴリズ
ムの通りであることが分かるだろう.
この関数を呼び出すときには,次のようにする.
insertion_sort(a,10);
整列すべき整数は,
a[0]〜
a[9]に入っている.データの個数は10個である.
著作権の関係で,教科書のこのプログラムはここには書かないが,よく理解しておけ!
図 21:
単純挿入ソートを使った整数の整列.教科書 [1]p.219のリスト
6.20 insertion_sort()関数の動作.
|
単純挿入ソートの計算量は,内側の繰り返し分のループ回数で決まる.教科書 []p.219のリスト6.20では,
jの部分のループ回数である.ここでは,その計算
量のオーダーを見積もる.
ソートするデータの個数をとする.外側のループは〜までである.データがランダムの場合,
内側のループは平均して回繰り返される.したがって,内側のループの総繰り返し回数は,
|
(1) |
となる.データの個数が大きくなると,
が支配的になる.したがって,計算量のオー
ダーは
となる.コンピューターでの処理の時間は,データ数の二乗(
)で増
加するということである.
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成19年7月27日