0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonでクイックソートを書いてみたメモ

Posted at

クイックソートについて自分用にメモを書いてみました。

クイックソートとは

  • 分割統治法に基づく高速なソートアルゴリズムで、大きなデータサイズに対応できる。
  • 計算量はO(nlogn)
    • logn個の階層があり、各層ごとの計算量はO(n)であるため。
  • ソートすると同じ値の順序が変わってしまう不安定なソート
  • 一時的にデータを保存するメモリは必要ない

コード

quick_sort.py
def partition(A, p, r):
    x = A[r-1]
    i = p-1
    for j in range(p, r-1):
        if A[j] <= x:
            i += 1
            A[i], A[j] = A[j], A[i]
    A[i+1], A[r-1] = A[r-1], A[i+1]
    
    return i+1
    
n = int(input())
A = list(map(int, input().split()))


def quick_sort(A, p, r):
    if p < r:
        q = partition(A, p, r)
        quick_sort(A, p, q)
        quick_sort(A, q+1, r)
    return A
        
print(quick_sort([3, 1, 10, 2.5, 11, 3, 21,4, -1], 0, 9))
# [-1, 1, 2.5, 3, 3, 4, 10, 11, 21]

上記のアルゴリズムは基準の選び方が一定(最後尾の値)なので、データの並びによっては効率が悪くなる
計算量がO(n^2)になるかも
再帰が深くなりすぎてエラーになるかも
そのため、基準の選び方をランダムにする、中央値を選ぶなど工夫する必要がある。

参考

ソートアルゴリズムと Python での実装

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?