# 划分(基于主元 pivot),注意:非就地划分 defpartition(seq): pi = seq[0] # 挑选主元 lo = [x for x in seq[1:] if x <= pi] # 所有小的元素 hi = [x for x in seq[1:] if x > pi] # 所有大的元素 return lo, pi, hi
# 查找第 k 小的元素 defselect(seq, k): # 分解 lo, pi, hi = partition(seq) print(lo, pi, hi) m = len(lo) if m == k- 1: return pi # 解决! elif m < k: return select(hi, k - m - 1) else: return select(lo, k)
# 划分(基于主元 pivot),注意:非就地划分 defpartition(seq): pi = seq[0] # 挑选主元 lo = [x for x in seq[1:] if x <= pi] # 所有小的元素 hi = [x for x in seq[1:] if x > pi] # 所有大的元素 return lo, pi, hi
# 查找第 k 小的元素 defselect(seq, k): # 分解 lo, pi, hi = partition(seq) m = len(hi) if m == k - 1: return pi # 解决! elif m < k: return select(lo, k - m - 1) else: return select(hi, k) if __name__ == '__main__': seq = [3, 4, 1, 6, 3, 7, 9, 13, 93, 0, 100, 1, 2, 2, 3, 3, 2] print(select(seq, 1)) print(select(seq, 2))
快速排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
li = [100, 2, 89, 98, 23, 76, 38, 85, 12, 9, 4]
defquick_sort2(li): iflen(li) < 2: return li tmp = li[0] left_list = [x for x in li[1:] if x < tmp] right_list = [x for x in li[1:] if x > tmp]