Engineering Note

プログラミングなどの技術的なメモ

バブルソート (Pythonによるアルゴリズムとデータ構造)

bubble sort

本記事は、ソフトバンクパブリッシングから発行されている「定本 Cプログラマのためのアルゴリズムとデータ構造 (SOFTBANK BOOKS)」を参考にPythonアルゴリズムとデータ構造について学習していきます。

今回は、単純な整列アルゴリズムであるバブルソート(Bubble Sort)について学んでいきます。

 

 

バブルソートとは

バブルソート(Bubble Sort)とは、リストの最後から先頭に向かってスキャンをしていき、大小を比較した後に、n番目の値がn-1番目の値より小さければ(昇順の場合)入れ替えをします。

バブルソートでは、外側のループと内側のループに分けてスキャンをしていき、外側のループではリストの先頭からリストのサイズn-1までループし、内側のループではリストの最後から整列済でないインデックスまでをスキャンしていきます。

そのため、バブルソートでは値の小さいものから順番に前へと(泡のように)浮かび上がってくる特徴があることから、このような名前が付いたようです。

また、外側ではn-1回のループ:O(n)、内側では\frac{n}{2}回のループ:O(n)、その他はO(1)のため、O(n^2)の計算量となります。

なお、バブルソート安定な整列アルゴリズム(データの位置関係が保存される)となります。

 

Pythonバブルソートを実装してみる

それでは、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データとして保存しておき、これをロードします。

自環境で実行した結果を以下にまとめます。

 

データ20,000個を整列した結果一覧
アルゴリズム 比較回数 交換回数 所要時間(秒)
Python 組込みメソッド(sort()) / / 0.015
Bubble Sort 199,990,000 100,645,566 72.979

 

比較や交換の回数はn^2に比例するため、データ数を2倍に増やした場合では、2^2=4倍の時間を要します。

 

参考書籍

定本 Cプログラマのためのアルゴリズムとデータ構造 (SOFTBANK BOOKS)