堆排序
代码如下:
'''
堆排序:
时间复杂度:O(n*logn)
实现较大数据n的topk问题
'''
def sift(li, low, high):
'''
:param li: 列表
:param low: 根节点
:param high: 最后一个节点
:return:
'''
i = low
j = 2*i+1
temp = li[low]
while j<=high:
if j+1<=high and li[j+1]>li[j]:
j = j+1
if li[j]>temp:
li[i] = li[j]
i = j
j = 2*i+1
else:
li[i] = temp
break
else:
li[i] = temp
def heap_sort(li):
n = len(li)
for i in range((n-2)//2, -1, -1):
sift(li, i, n-1)
for i in range(n-1, -1 , -1):
li[0], li[i] = li[i], li[0]
sift(li, 0, i-1)
'''
TOPk问题:
当n比较大时,取前 k 个数
1.堆排序方法排序比较快: O(nlogk)
2.冒泡,选择排序:kn
3.快排:n*logn
'''
def topk(li, k):
n = len(li)
heap = li[0:k]
for i in range((k-2)//2, -1, -1):
sift(heap, i, k-1)
for i in range(k, n):
if li[i] < heap[0]:
heap[0] = li[i]
sift(heap, 0, k-1)
for i in range(k-1, -1, -1):
heap[i], heap[0] = heap[0], heap[i]
sift(heap, 0, i-1)
return heap
li=[1, 3, 2, 4, 6, 7, 8, 5]
print(topk(li, 5))
heap_sort(li)
print(li)
结果如下:
