バブルソート
バブルソートとは、すべての隣接する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]