堆排序
1、二叉树
1.1 二叉树
- 每个节点最多有两个子节点,且左右子树的顺序不能任意颠倒
1.2满二叉树
- 深度为n, 由2^(n-1)个节点构成的二叉树为满二叉树
1.3完全二叉树
- 完全二叉树是由满二叉树而引出来的,设二叉树的深度为n, 如果1->(n-1)层均是满节点的,即为一个满二叉树,且第n层的所有节点都连续集中在左侧
2、堆(完全二叉树)
- 大根堆: 每一个父节点都比其子节点大
- 小根堆: 每一个父节点都比其子节点小
3、堆排序过程
1.构造堆
2.堆顶元素为最大元素
3.去掉堆顶元素,将最后一个元素放置堆顶,通过一次调整重新使堆有序
4.获得第二大元素
5.重复步骤3,直至堆中无元素

- 复杂度 O(nlogn), 每一层向下logn,共有n层
def sift(li,top,end):
tmp = li[top]
i = top
j = 2*i + 1
while j <= end:
if j+1 <= end and li[j+1] > li[j]:
j = j+1
if li[j] > tmp:
li[i] = li[j]
i = j
j = 2*i + 1
else:
li[i] = tmp
break
else:
li[i] = tmp
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)
li = [2,4,3,6,9,1,7,8,5]
heap_sort(li)
print(li)
[1, 2, 3, 4, 5, 6, 7, 8, 9]