本記事は、ソフトバンクパブリッシングから発行されている「定本 Cプログラマのためのアルゴリズムとデータ構造 (SOFTBANK BOOKS)」を参考にPythonでアルゴリズムとデータ構造について学習していきます。
今回は、単純な整列アルゴリズムであるバブルソート(Bubble Sort)について学んでいきます。
バブルソートとは
バブルソート(Bubble Sort)とは、リストの最後から先頭に向かってスキャンをしていき、大小を比較した後に、番目の値が番目の値より小さければ(昇順の場合)入れ替えをします。
バブルソートでは、外側のループと内側のループに分けてスキャンをしていき、外側のループではリストの先頭からリストのサイズまでループし、内側のループではリストの最後から整列済でないインデックスまでをスキャンしていきます。
そのため、バブルソートでは値の小さいものから順番に前へと(泡のように)浮かび上がってくる特徴があることから、このような名前が付いたようです。
また、外側では回のループ:、内側では回のループ:、その他はのため、の計算量となります。
なお、バブルソートは安定な整列アルゴリズム(データの位置関係が保存される)となります。
Pythonでバブルソートを実装してみる
# bubble_sort.py import time import pickle def bubble_sort(lst): for i in range(len(lst)-1): for j in range(len(lst)-1, i, -1): if lst[j-1] > lst[j]: tmp = lst[j] lst[j] = lst[j-1] lst[j-1] = tmp with open('sample_data.pkl', 'rb') as f: lst = pickle.load(f) start = time.time() bubble_sort(lst) print("elapsed {} sec".format(time.time() - start))
動作確認
それでは上記で作成したスクリプトを実行してみます。
事前に1~20,000までの値からランダムに20,000個生成したリストをpickleデータとして保存しておき、これをロードします。
自環境で実行した結果を以下にまとめます。
アルゴリズム名 | 比較回数 | 交換回数 | 所要時間(秒) |
---|---|---|---|
Python 組込みメソッド(sort()) | / | / | 0.015 |
Bubble Sort | 199,990,000 | 100,645,566 | 72.979 |
比較や交換の回数はに比例するため、データ数を2倍に増やした場合では、倍の時間を要します。