在一個已知的未排序 list 中尋找第 k 大的物件是經典的 selection 問題。有許多的演算法針對各種變形提出極為優化的解法。底下是我練習 C.A.R. Hoare 的 quickselect ,但我將其改成 not-in-place 的版本。(為何有這篇?因為臨時有一個小時不知道要幹嘛...拿來複習遞迴剛剛好 :-P)
- #!/usr/bin/env python
- import random
- def kth(L, k):
- le = []
- eq = []
- gt = []
- pivot = L[random.randint(0, len(L))]
- for e in L:
- if e < pivot:
- le.append(e)
- elif e > pivot:
- gt.append(e)
- else:
- eq.append(e)
- if k <= len(gt):
- return kth(gt, k)
- elif k <= (len(gt) + len(eq)):
- return pivot
- else:
- return kth(le, (k - len(gt) - len(eq)))
- print(kth(range(1000), 5))
留言
張貼留言