(1) 選択ソート(単純選択法)

選択ソート(単純選択法)とは

選択ソート(単純選択法)は、配列の中から最小の要素を見つけて、先頭に移動させることを繰り返すことでソートするアルゴリズムです。

手順

  1. 整列していない配列(リスト)を用意します。
  2. 未整列の先頭の値を暫定の最小値とします。
  3. 未整列部分の2番目から末尾までを調べ、最小値の位置を記録します。
  4. 未整列の先頭と、見つけた最小値の位置が異なる場合は交換し、未整列の先頭を整列済みにします。
  5. (2)(4)を繰り返し、すべての値が整列済みになれば終了します。

デモンストレーション

プログラム

Colaboratoryのノートブックに書き写しながら、理解しましょう。


arr = [6, 3, 2, 0, 7, 1, 4, 5] # 元のリスト
print(arr)    # ソート前を出力
n = len(arr)

print("------------------------")
        
for i in range(n - 1):                # 未整列の左端を1つずつ後にずらしていく(繰り返しインデックスの変数をiとする)
  min_index = i                     # 暫定最小値の位置(初期値は未整列の先頭のインデックス=i)
  for j in range(i + 1, n):         # 未整列部分の2番目(i+1)から末尾まで繰り返す(繰り返しインデックスの変数をjとする)
    if arr[min_index] > arr[j]:   # 暫定最小値よりもインデックス番号jの値が小さければ、
      min_index = j             # 暫定最小値の位置をインデックス番号jとする
                    # この時点で、未整列の最小値がarr[min_index]と決まる
  if min_index != i:                # インデックス番号iの要素と未整列の最小値を交換する
    tmp = arr[min_index]
    arr[min_index] = arr[i]
    arr[i] = tmp
  print(arr)                        # 途中経過を出力

print("------------------------")
print(arr)    # ソート後を出力
      

[6, 3, 2, 0, 7, 1, 4, 5]
------------------------
[0, 3, 2, 6, 7, 1, 4, 5]
[0, 1, 2, 6, 7, 3, 4, 5]
[0, 1, 2, 6, 7, 3, 4, 5]
[0, 1, 2, 3, 7, 6, 4, 5]
[0, 1, 2, 3, 4, 6, 7, 5]
[0, 1, 2, 3, 4, 5, 7, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
------------------------
[0, 1, 2, 3, 4, 5, 6, 7]
      
関連項目

4-1. リニアサーチ(線形探索法) 最小値探索のプログラム

4-3. バブルソート(単純交換法) 配列内の要素の交換

このアルゴリズムの特徴

比較回数

最初に、\(n-1\) 回の比較を行って、最小値を探します。次に、残りの未整列要素 \(n-2\) 個の最小値を探すために \(n-2\) 回の比較を行います。よって、

\[ 比較回数 = (n-1) + (n-2) + (n-3) + \cdots + 2 + 1 = \frac{1}{2}n(n-1) \]

となります。

交換回数

未整列部分の最小値の位置が未整列の先頭と異なる場合に、1回交換します。よって、最大交換回数は \(n-1\) 回となります。

バブルソートとの比較

比較回数はどちらのアルゴリズムも同じ回数ですが、最大交換回数は選択ソートの方が小さくなるので、バブルソートよりは少しだけ速くなります。しかし、どちらのアルゴリズムも高効率とはいえず、次ページ以降のアルゴリズムがよく用いられます(プログラミングの学習としては、バブルソートや選択ソートは最適です)。

練習問題

問1

問2

問3

問4