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]])])