大(小)根堆特性
- 堆排序中小根堆对应降序,大根堆对应升序(以下所有以大根堆为例)。
- 是一种完全二叉树(叶子节点层级差不大于1,且最后一层节点靠左排列,但不一定是满二叉树)。
- 父节点值大于两个子节点的值,所以二叉树的根为最大值。
排序思想
- 堆排序是选择排序的一种改进,以
O(NlogN)
的时间复杂度构建出大根堆(最大值位于堆顶)。 - 然后每次取堆顶的最大值放入数组尾端,调整剩余二叉树,使其重新成为大根堆,方便下一次选取,此步骤的时间复杂度也为
O(NlogN)
。
Java代码
public void HeapAdjust(int[] array, int parent, int end) {
int temp = array[parent];
int child = 2 * parent + 1;
while (child <= end) {
if (child < end && array[child] < array[child + 1]) {
child++;
}
if (temp >= array[child])
break;
array[parent] = array[child];
parent = child;
child = 2 * child + 1;
}
array[parent] = temp;
}
public void heap(int[] array) {
for (int i = array.length / 2-1; i >= 0; i--) {
HeapAdjust(array, i, array.length-1);
}
for (int i = array.length - 1; i > 0; i--) {
int temp = array[i];
array[i] = array[0];
array[0] = temp;
HeapAdjust(array, 0, i-1);
}
}