需求
根据快速排序算法,求一个列表中第n大的数字
常规解法
把列表从大到小排序,直接取索引为 n-1 的数字
优化解法
根据快速排序的想法,可以在排序完成之前,就可以找到第n大的数字
def top_n(ls, n):
pivot = ls[0]
# left = []
# middle = []
# right = []
# for each in ls:
# if each < pivot:
# left.append(each)
# elif each == pivot:
# middle.append(each)
# else:
# right.append(each)
left = [each for each in ls if each < pivot]
middle = [each for each in ls if each == pivot]
right = [each for each in ls if each > pivot]
if len(right) < n:
n = n - len(right)
if len(middle) < n:
return top_n(left, n - len(middle))
else:
return pivot
else:
return top_n(right, n)
使用列表表达式,代码短一些,不过多了两层循环,建议使用正常的循环