堆树
堆树的特点
1.是完全二叉树
2.每个节点都大于等于(或小于等于)其子树。
堆树的分类
1.大顶堆,每个节点都大于等于其子树
2.小顶堆,每个节点都小于等于其子树
堆排序
1.按照完全二叉树保存数组(建堆)
2.选最后一个非叶子节点开始堆化(长度为n的数组,第n/2-1个为第一个非叶子节点)
堆排序代码(以大顶堆为例)
public class HeapTree {
public static void heapSort(int[] data) {
int len = data.length;
for (int i = len / 2 - 1; i >= 0; i--) {
maxHeap(data, i, len);
}
for (int i = len - 1; i >= 0; i--) {
int x = data[0];
data[0] = data[i];
data[i] = x;
maxHeap(data, 0, i);
}
}
// 建一个大顶堆,end表示最多建到的点
public static void maxHeap(int[] data, int start, int end) {
int parent = start;
// 下标是从0开始的就要加1,从1就不用
int son = 2 * parent + 1;
int temp = son;
while (son < end) {
if (son + 1 < end && data[son] < data[son + 1]) {
temp = son + 1;
}
if (data[parent] >= data[temp]) {
return;
} else {
data[parent] = data[parent] ^ data[temp];
data[temp] = data[parent] ^ data[temp];
data[parent] = data[parent] ^ data[temp];
}
}
}
public static void main(String[] args) {
int data[] = {8, 4, 20, 7, 3, 1, 25, 14, 17};
heapSort(data);
System.out.println(Arrays.toString(data));
}
}
测试结果:
[1, 3, 4, 7, 8, 20, 14, 17, 25]
比如微博热搜,优先队列的实现都需要堆树的作用。