方法1:内置sorted函数,然后切片:
def fun1(list1, k):
if len(list1) < k:
print(‘k too long’, list1)
pass
else:
ret = sorted(list1)[:-k - 1:-1]
print(‘fun1:’, ret)
return ret
方法2,最大堆 ,维护一个k长的列表,将列表内的最大元素和剩下的其他元素比较,大
的加进堆并弹出堆内最小元素,时间复杂度 N*logk
def fun2(list1, k):
if len(list1) < k:
print(‘k too long’, list1)
pass
else:
list_k = list1[0:k]
# print(‘list_k_origin:’, list_k)
list_orther = list1[k + 1:]
# print(list_orther)
for x in list_orther:
if x > max(list_k):
list_k.append(x)
list_k.remove(min(list_k))
print(‘fun2:’, list_k)
return list_k
方法3,快速排序,只要排到第k长度就可以停止,所以复杂度接近于O(n)
def fun3(list1, k):
if len(list1) < k:
print(‘k too long’, list1)
pass
pivot = list1[-1]
list_right = [pivot] + [x for x in list1[:-1] if x >= pivot]
len_right = len(list_right)
if len_right == k:
return list_right
elif len_right > k:
return fun3(list_right, k)
else:
list_left = [y for y in list1[:-1] if y < pivot]
return fun3(list_left, k - len_right) + list_right
import time
start1 = time.perf_counter()
list1 = [i for i in range(51)]
fun1(list1, 10)
end1 = time.perf_counter()
print(end1 - start1)
start2 = time.perf_counter()
list1 = [i for i in range(51)]
fun2(list1, 10)
end2 = time.perf_counter()
print(end2 - start2)
start3 = time.perf_counter()
list1 = [11, 8, 4, 1, 5, 2, 7, 9]
list1 = [i for i in range(51)]
print(‘fun3:’, fun3(list1, 10))
end2 = time.perf_counter()
print(end2 - start2)