アルゴリズムと データ構造

アルゴリズムと
データ構造
第7回
ソート
ソートの基本

ソートとは
 データの集合を、キーとなる項目の値の大小関
係に基づいて、ある一定順序に並べ替える作業
小さい順:昇順
 大きい順:降順

ソートの基本

ソートの安定性
 等しいキー値を持つデータの位置関係
ソート前後でも保持:安定なソート
 ソート前後で不確定:安定ではないソート


内部ソートと外部ソート
 内部ソート

すべてのデータが1つの配列上に格納可能な場合
 外部ソート

データが大量で1度に並べ替えられない場合
単純交換ソート

単純交換ソートとは
 隣り合うデータの大小関係を順に比較し、必要な
らば交換する作業を繰り返すことで並べ替え
 別名:バブルソート
6
1
1
6
4
1
4
3
1
3
7
7
1
8
9
9
8
単純交換ソート

単純交換ソートのアルゴリズム
 1回目のパスで、n-1回比較・交換
 2回目のパスで、n-2回比較・交換
 以下繰り返し、パスをn-1回行うことでソート完了


先頭からn-1個の要素がソート済みなら、n個目は自動
的に決定
安定性
 隣り合う要素のみ交換するので安定
単純交換ソート

単純交換ソートのプログラム
 パス処理をn-1回実行するループを構成

iループ:0からn-2まで
 各パスで比較・交換するループを内部に構成
jループ
 末尾側から先頭側へ:jを末尾n-1からデクリメント
 jとj-1の要素を比較、j-1が大きければ交換
 kパス目ではjがkになるまで繰り返し:jはi+1まで

単純交換ソート

単純交換ソートのプログラム
for (i = 0; i < n - 1; i++)
for (j = n - 1; j > i; j--)
if (a[j - 1] > a[j])
swap(&a[j - 1], &a[j]);
単純交換ソート

単純交換ソートの改良
 あるパスで交換が1度も行われないとき、それ以
降のパスでも交換は起きない→各パスで交換回
数をカウントして0ならソート終了
1
3
6
4
4
6
7
8
9
単純交換ソート

単純交換ソートの改良プログラム
for (i = 0; i < n - 1; i++) {
int exchg = 0;
/* 交換回数カウント */
for (j = n - 1; j > i; j--)
if (a[j - 1] > a[j]) {
swap(&a[j - 1], &a[j]); exchg++;
}
if (exchg == 0) break; /* 交換回数0なら終了 */
}
単純交換ソート

単純交換ソートの改良(2)
 あるパスである時点以降交換がなかったら、その
先はすでにソート済み→次のパスでソートすべき
範囲が絞れる
1
3
9
4
9
4
6
7
6
7
8
6
8
単純交換ソート

単純交換ソートの改良プログラム(2)
while (k < n - 1) {
int j, last = n - 1;
for (j = n - 1; j > k; j--)
if (a[j - 1] > a[j]) {
swap(&a[j - 1], &a[j]); last = j;
}
k = last;
}
単純選択ソート

単純選択ソートとは
 最小要素を選択し、それを先頭要素と交換
 同様に次の最小要素を順次先頭側要素と交換
6
1
4
3
8
4
8
4
3
6
6
8
1
7
9
8
8
7
9
単純選択ソート

単純選択ソートのアルゴリズム
 未ソ-ト部から最小のキー値を持つ要素を選択
 選択した要素と未ソート部の先頭要素を交換
 以上を未ソート部がなくなるまでn-1回繰り返し

安定性
 離れた要素を交換することがあるため安定では
ない
単純選択ソート

単純選択ソートのプログラム
for (i = 0; i < n - 1; i++) {
int min = i;
for (j = i + 1; j < n; j++)
if (a[j] < a[min])
min = j;
swap(&a[i], &a[min]);
}