2、堆排序
写于:2020/11/16
学习背景:大厂有一个面试题,从1亿人中,找出最富有的10个人,就需要用到堆排序,然而我不会,所以就学习它,并记录下来。
代码实现:
# -*- coding: utf-8 -*-
# @Time : 2020/11/16 22:13
# @Author : 成文武
def heapify(tree,n,i):
#递归退出条件
if i>=n:
return
c1=2*i+1 #左子树下标
c2=2*i+2 #右子树下标
max=i
if c1<n and tree[c1]>tree[max]:
max=c1
if c2<n and tree[c2]>tree[max]:
max=c2
if max!=i:
tree[i],tree[max]=tree[max],tree[i]
#前提:父节点的子树都已经是堆
heapify(tree,n,max)
def build_heap(tree,n):
last_node=n-1
#从最后一个节点的父节点开始建堆
parent=int((last_node-1)/2)
for i in range(parent,-1,-1):
heapify(tree,n,i)
def heap_sort(tree):
n=len(tree)
build_heap(tree,n)
for i in range(n-1,-1,-1):
#根节点与最后一个节点交换
tree[i],tree[0]=tree[0],tree[i]
#每交换一次后,叶子节点减少一个
heapify(tree,i,0)
return tree
if __name__ == '__main__':
phone_tree=[1,5,7,6,6,5,0,7,6,9,1]
res=heap_sort(phone_tree)
print(res) #[0, 1, 1, 5, 5, 6, 6, 6, 7, 7, 9]