━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ データ構造・アルゴリズム論 確認問題11 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
●問 (基本的な整列アルゴリズム) 整数のデータ 4, 8, 7, 0, 3 をこの順に配列に格納して, 次の各整列アルゴリズムで値を小さい順に並べ替えるときの,配列の変化を示せ. 授業で扱った(教科書の)アルゴリズムを使い,外側のループを回るごとの 配列の中身を答えること. (1) 単純選択ソート (2) 単純挿入ソート (3) バブルソート ────────────────────────────────────── ●答 (基本的な整列アルゴリズム) (1) 単純選択ソート 実行前 4, 8, 7, 0, 3 反復ごとの結果 0, 8, 7, 4, 3 0, 3, 7, 4, 8 0, 3, 4, 7, 8 0, 3, 4, 7, 8 (2) 単純挿入ソート 実行前 4, 8, 7, 0, 3 反復ごとの結果 4, 8, 7, 0, 3 4, 7, 8, 0, 3 0, 4, 7, 8, 3 0, 3, 4, 7, 8 (3) バブルソート 実行前 4, 8, 7, 0, 3 反復ごとの結果 4, 7, 0, 3, 8 4, 0, 3, 7, 8 0, 3, 4, 7, 8 0, 3, 4, 7, 8 [解説] (1) 単純選択ソートでは,外側のループの本体が(要素数-1)回実行される. 毎回,未整列部分から最小値を選び,未整列部分の先頭要素と交換することで, 整列済み部分を1要素ずつ増やす. この問題の例では,最小値の選択と交換が次の通りに実行される. 反復1回目: 4, 8, 7, 0, 3 から 0 を選択,4 と交換. 反復2回目: 8, 7, 4, 3 から 3 を選択,8 と交換. 反復3回目: 7, 4, 8 から 4 を選択,7 と交換. 反復4回目: 7, 8 から 7 を選択,7 と交換 (実質的には変化なし). (2) 単純挿入ソートでは,外側のループの本体が(要素数-1)回実行される. 毎回,未整列部分の先頭要素を,整列部分の適切な位置に挿入することで, 整列済み部分を1要素ずつ増やす. この問題の例では,要素の挿入が次の通りに実行される. 反復1回目: 8 を整列部分 4 の末尾に挿入. 反復2回目: 7 を整列部分 4, 8 の2番目に挿入. 反復3回目: 0 を整列部分 4, 7, 8 の先頭に挿入. 反復4回目: 3 を整列部分 0, 4, 7, 8 の2番目に挿入. (3) バブルソートでは,毎回,未整列部分を左から右へ走査して, 隣り合う2値が逆順なら交換することを繰り返す.これにより, 未整列部分の最大値を整列部分の先頭に移し,整列済み部分を1要素ずつ増やす. この問題の例では,値の交換が次の通りに実行される. 反復1回目: (8,7), (8,0), (8,3) を交換. 反復2回目: (7,0), (7,3) を交換. 反復3回目: (4,0), (4,3) を交換. 反復4回目: 交換なし. 教科書のアルゴリズムは,交換が不要になると実行を終える. この工夫により,入力が(ほぼ)整列済みの場合に,処理を早めに打ち切れる. ただし,途中で打ち切って良いことの確認には,未整列部分を全て走査して 交換が起こらなかったことを確かめる必要がある. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 授業のホームページ 山田 俊行 https://www.cs.info.mie-u.ac.jp/~toshi/