![見出し画像](https://assets.st-note.com/production/uploads/images/71927298/rectangle_large_type_2_65b21b1d08333ba170762615c0b71399.png?width=800)
【第一回アルゴリズム勉強】Pythonでバブルソート + クイックソート🐩🐕🐕🦺
アルゴリズム勉強会を始めた💓
今回はクイックソートについて学び開発仲間に複数のソートを教えたので、簡単にソースコードを貼っていこうと思う。
環境
Python3🐍
AOJで開発勉強メンバの理解を確認(AtCoderでいい感じのイージー問題を見つけれかったためAOJ)✒️✒️✒️
バブルソート🔵🔵🔵
すごい簡単なので簡易的にソートを行いときに良く使っていますw。(Goのバージョンが低い時とか?)
参考
AOJ
コード
# def bubble_sort(array: list):
# for i in range(len(array)):
# for j in range(0, len(array) - i - 1):
# if array[j] > array[j + 1]:
# array = swap(array, j, j + 1)
def swap(array: list, a: int, b: int):
array[a], array[b] = array[b], array[a]
return array
def count_bubble_sort_swap(array: list):
result = 0
for i in range(len(array)):
for j in range(0, len(array) - i - 1):
if array[j] > array[j + 1]:
array = swap(array, j, j + 1)
result += 1
return result
while True:
n = int(input())
if n == 0:
break
arr = []
for i in range(n):
arr.append(int(input()))
print(count_bubble_sort_swap(arr))
クイックソート🌪🌪🌪🌪🌪🌪
適当なところを探すのは辛いと思いますが、ある程度探索対象量が多い時に使うイメージ
参考
AOJ
コード
import copy
def swap(arr: list, i, j: int) -> list:
arr[i], arr[j] = arr[j], arr[i]
return arr
def partition(arr: list, start, end: int, listGetter) -> (list, int):
pivot = listGetter(arr, end)
p = start
for i in range(start, end):
if listGetter(arr, i) <= pivot:
swap(arr, p, i)
p += 1
return swap(arr, p, end), p
def quick_sort(arr: list, start, end: int, listGetter):
if start < end:
# print(arr, start, end, ":", arr[start:end + 1], end="->")
_, p = partition(arr, start, end, listGetter)
# print(arr[start:end + 1], "left:", arr[start:p], "right:", arr[p + 1:end + 1], p)
quick_sort(arr, start, p - 1, listGetter)
quick_sort(arr, p + 1, end, listGetter)
return arr
class Value:
value: int
key: str
def __init__(self, value: int, key: str):
self.value = value
self.key = key
if __name__ == '__main__':
arr = []
n = int(input())
for i in range(n):
kv = input().split(" ")
arr.append(Value(key=kv[0], value=int(kv[1])))
stabled = sorted(copy.deepcopy(arr), key=lambda x: x.value)
quick_sort(arr, 0, len(arr) - 1, lambda a, i: a[i].value)
isStable = True
for i, v in enumerate(stabled):
if arr[i].key != v.key or arr[i].value != v.value:
isStable = False
break
print("Stable" if isStable else "Not stable")
for v in arr:
print(v.key, v.value)
GitHub
この記事が気に入ったらサポートをしてみませんか?