Python でバブルソート
すごくわかりやすい
def bubble_sort(lst): n = len(lst) for i in reversed(range(n)): for j in range(i): if lst[j] > lst[j + 1]: lst[j], lst[j + 1] = lst[j + 1], lst[j] lst = [3333, 5123, 9981, 1243, 7412] bubble_sort(lst) print(lst) # [1243, 3333, 5123, 7412, 9981]
途中経過を表示するコード
def bubble_sort(lst): n = len(lst) for i in reversed(range(n)): for j in range(i): print_interim_progress(lst, i, j) if lst[j] > lst[j + 1]: lst[j], lst[j + 1] = lst[j + 1], lst[j] # def print_interim_progress(lst, i, j): print(interim_progress(lst, i, j)) print(lst) print() def interim_progress(lst, i, j): """ソートの途中経過を表示するリスト ['oo', 'oo', ' ', '--', '--'] [5369, 5577, 3393, 7958, 8263] [' ', 'xx', 'xx', '--', '--'] [5369, 5577, 3393, 7958, 8263] 'oo' ... 要素を交換しなくてよい 'xx' ... 要素を交換しないといけない '--' ... ソート完了している ' ' ... ソート完了していない """ log = [' '] * (i + 1) + ['--'] * (len(lst) - (i + 1)) log[j] = log[j + 1] = 'xx' if lst[j] > lst[j + 1] else 'oo' return log # import random lst = [random.randint(1000, 9999) for i in range(5)] bubble_sort(lst) print(lst)
こんな感じで表示してくれます。
>>> bubble_sort(lst) ['xx', 'xx', ' ', ' ', ' '] [5648, 4307, 5944, 2430, 3586] [' ', 'oo', 'oo', ' ', ' '] [4307, 5648, 5944, 2430, 3586] [' ', ' ', 'xx', 'xx', ' '] [4307, 5648, 5944, 2430, 3586] [' ', ' ', ' ', 'xx', 'xx'] [4307, 5648, 2430, 5944, 3586] ['oo', 'oo', ' ', ' ', '--'] [4307, 5648, 2430, 3586, 5944] [' ', 'xx', 'xx', ' ', '--'] [4307, 5648, 2430, 3586, 5944] [' ', ' ', 'xx', 'xx', '--'] [4307, 2430, 5648, 3586, 5944] ['xx', 'xx', ' ', '--', '--'] [4307, 2430, 3586, 5648, 5944] [' ', 'xx', 'xx', '--', '--'] [2430, 4307, 3586, 5648, 5944] ['oo', 'oo', '--', '--', '--'] [2430, 3586, 4307, 5648, 5944] >>>
◯ 挿入ソート もっと簡単な書き方
O(n2) でいいなら、もっと簡単に書けます。 ただ、書き方は簡単だけど、説明はしづらい。
def sort(lst): n = len(lst) for i in range(n): for j in range(i): if lst[j] > lst[i]: lst[j], lst[i] = lst[i], lst[j] lst = [3333, 5123, 9981, 1243, 7412] sort(lst) print(lst) # [1243, 3333, 5123, 7412, 9981]