[ソート] 選択ソート

バブルソート バブルソート(bubble sort) は、ソートのアルゴリズムの一つ。隣り合う要素の大小を比較しながら整列させること。最悪計算時間がO(n2)と遅いが、アルゴリズムが単純で実装が容易なため、また並列処理との親和性が高いことから、しばしば用いられる。...

選択ソート

選択ソート: selection sort)は、ソートアルゴリズムの一つ。配列された要素から、最大値やまたは最小値を探索し配列最後の要素と入れ替えをおこなうこと。最悪計算時間がO(n2)と遅いが、アルゴリズムが単純で実装が容易なため、しばしば用いられる。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

選択ソートは、配列を 「ソート済み部分」と「未ソート部分」との2つに分け、 「未ソート部分」 で最小値/最大値の検索を行い、その結果を 「ソート済み部分」 に移動させることでソートを行います。

より具体的には、配列の中で最も小さい値を探して、その要素と先頭の要素と交換します。この時点で、先頭が 「ソート済み部分」に、残りが 「未ソート部分」になります。

次に、「未ソート部分」に該当する配列2番目以降のデータから一番小さい値を探して、2番目の要素と交換します。この時点で、先頭と2番目が 「ソート済み部分」に、残りが 「未ソート部分」になります。 … これを、リストの最後まで繰り返すと、最終的に昇順にソートされます。

計算量はバブルソートと同じ\( O (N^2)\)ですが、選択ソートはバブルソートより高速です。

また、対象となる配列が小さい時はクイックソートよりも高速になるので、配列の要素数によるソート方法の使い分けが行われます。

同じ \( O (N^2)\) の計算量である挿入ソートと比較すると、選択ソートは配列への「書き込み」回数が挿入ソートより少ないので、特にフラッシュメモリのような書き込みコストの高いメモリを使う場合は有用になります。

内部ソートですが、安定ソートではありません。

Python で実装

選択ソートを Python で実装します。

import random

def selection_sort(array):
    for i in range(len(array)):
        least = i
        for k in range(i + 1 , len(array)):
            if array[k] < array[least]:
                least = k
        swap(array, least, i)
    return array

def swap(array, x, y):
    array[y], array[x] = array[x], array[y]



if __name__ == '__main__':
    # ランダムな配列の生成
    random.seed(1)
    array = [random.randrange(100) for i in range(10)]
    print('未ソート', array)
    # 未ソート [17, 72, 97, 8, 32, 15, 63, 97, 57, 60]
    
    print('ソート済み', selection_sort(array)) 
    # ソート済み [8, 15, 17, 32, 57, 60, 63, 72, 97, 97]
挿入ソート 挿入ソート(インサーションソート)は、ソートのアルゴリズムの一つ。整列してある配列に追加要素を適切な場所に挿入すること。平均計算時間・最悪計算時間がともにO(n2)と遅いが、アルゴリズムが単純で実装が容易なため、しばしば用いられる。 出典...