0
0

[Python] バブルソート

Posted at

バブルソート

バブルソートとは、すべての隣接する2つの要素の値を比較して、小さい方が前になるように交換していき、昇順に並べ替えるアルゴリズムです。ただし、総当たりで繰り返し比較交換していくので、データが大量にあると処理に時間がかかってしまいます。たいていのプログラミング言語にはソートするための関数があるので、いちいちバブルソートを自分で書くことは少ないと思いますが、頭の体操?として書いてみます。

二重ループを使った書き方 その1

末尾から2つの値を比較するやり方で書いてみます。ちなみにPythonでは変数tmpを使わなくても書けますが、最初は変数tmpを使ってみます。

Bubble1.py
lis = [5, 1, 7, 8, 4, 2, 9, 0] # 元のリスト
n = len(lis) # リストの長さ(要素数)

for i in range(n - 1): # 調べる範囲の開始位置を1つずつ後ろへ移動していく
    for j in range(n - 1, i, -1): # 末尾から隣接する2つの値を比較
        if lis[j] < lis[j - 1]: # 隣接する2つの値の末尾側が小さかったら交換
            tmp = lis[j]
            lis[j] = lis[j - 1]
            lis[j - 1] = tmp

print(lis)
# 昇順にソートされたリストが出力されました!
# [0, 1, 2, 4, 5, 7, 8, 9]

二重ループを使った書き方 その2

もちろん先頭から比較していってもOKです。
面倒なので(笑)、今度は変数tmpを使わずに書いてみます。

Bubble2.py
lis = [5, 1, 7, 8, 4, 2, 9, 0] # 元のリスト
n = len(lis) # リストの長さ(要素数)

for i in range(n):
        for j in range(n - i - 1):
            if lis[j] > lis[j + 1] :
                lis[j], lis[j + 1] = lis[j + 1], lis[j]

print(lis)
# 昇順にソートされたリストが出力されました!
# [0, 1, 2, 4, 5, 7, 8, 9]

whileも使った書き方

最後にwhileも使い、フラグも設定した書き方で書いてみます。

Bubble3.py
lis = [5, 1, 7, 8, 4, 2, 9, 0] # 元のリスト
n = len(lis) # リストの長さ(要素数)
swapped = True # forループ内で交換が発生したか監視するフラグを設定

while swapped:
    swapped = False
    for i in range(1, n):
        if lis[i - 1] > lis[i]:
            lis[i - 1], lis[i] = lis[i], lis[i - 1]
            swapped = True

print(lis)
# 昇順にソートされたリストが出力されました!
# [0, 1, 2, 4, 5, 7, 8, 9]
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0