アルゴリズム勉強 #4 クイックソートをpythonで実装する
2021.10.26
今回はクイックソートです!
  • 配列から基準点を決める
  • 基準値より小さい(left)と大きい(right)に分ける
  • 計算量は平均O(nlogn), 最悪O(n**2)
  • 最悪は分割がn-1個と0個の分割が最後まで続く場合
    • Tn(サイズnの配列を整列させるのに必要な回数
    • Tn = n - 1 + Tn-1 = (n-1) + (n-2) + ... = n(n-1)/2
  • 最良は分割が2分割でキレイに進む
    • 分割はlogn(=k)回
    • 分割が1回進んだとき2**(k-1)の配列が2つ
    • このときの比較回数が2(2**(k-1) - 1) = n-2 ~ n
    • O(nlogn)

試したコード

python
## merge sort
import random

def quick_sort(array):
    left = []
    right = []
    if len(array) <= 1:
        return array
    ref = random.choice(array)
    count = 0
    for element in array:
        if element < ref:
            left.append(element)
        elif element > ref:
            right.append(element)
        else:
            count += 1
    left = quick_sort(left)
    right = quick_sort(right)
    return left + [ref] * count + right

array = [i+1 for i in range(30)]
random.shuffle(array)
quick_sort(array)

References