3行でクイックソート in Python

def qsort(L):
 if not [ex for ex in L if ex not in L[:1]]:return L
 return qsort([lt for lt in L if lt<L[len(L)/2]])+[eq for eq in L if eq==L[len(L)/2]]+qsort([gt for gt in L if L[len(L)/2]<gt])
某書で見たのは見事なソースだったのだけど、
現実的にそれが使えるかと言えば多少アレだったので、
老婆心から手を加えてみた。
pivotの取り方で私が一番無難だと思うのが真ん中(L[len(L)/2]])なのでそれを採用。
再帰する前に、空リストと全要素が同じ同じリストを省いた。
で、これは偶然、安定なソートになる。ハズ。
しかし、本当のクイックソートの旨みは無くなっているような?


本当に私の好きなpivotはこれ。
def pivot(l):
 i = len(l)/2
 for x in l:
  if x != l[i]: return max(l[i], x)
 else:
  raise ‘リストがダメ’
同じではないけど、似たのを無理やり1行で書くと、こんな感じかも。
def pivot(L): return max([L[len(L)/2]]+[min([ex for ex in L if ex != L[len(L)/2]])])

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です