堆排序
最大堆,最小堆:
- 最大堆:
堆的最大元素存放在根结点中。并且,在任一子树中,该子树所包含的所有结点的值都不大于该子树根结点的值。即:A[PARENT(i) ≥ A[i]。堆排序使用最大堆。 - 最小堆:
堆的最小元素存放在根结点中。并且,在任一子树中,该子树所包含的所有结点的值都不小于该子树根结点的值。即:A[PARENT(i) ≤ A[i]。最小堆常用来构造优先队列。
将数组A看成一颗近似完全二叉树:
- 树的第一个根节点是A[0],最后一个根节点A[len(A)//2 - 1]
- 假定一个结点下标是i,则它的父节点,左孩子,右孩子下标如下:
1
2LEFT(i) : return 2i+1
RIGHT(i) : return 2i+2
- 如何建最大堆
- 如何维护最大堆
- 排序
1 | package cn.llnn.sort; |
1 | 待排序:[51, 46, 20, 18, 65, 97, 82, 30, 77, 50] |