一、堆与优先队列简介
堆(Heap)是一种特殊的完全二叉树结构,满足任意节点的值都大于等于(或小于等于)其子节点的值。本文实现的是最大堆(大根堆)。优先队列是堆的典型应用,支持以下两种核心操作:
-
插入元素:时间复杂度O(logn)
-
弹出最大值:时间复杂度O(logn)
源代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define cmp >
#define ROOT 1
#define FATHER(i) ((i) / 2)
#define LEFT(i) ((i) * 2)
#define RIGHT(i) ((i) * 2 + 1)
#define swap(a, b) { \
printf("swap(%d, %d)\n", a, b); \
int __c = (a); \
(a) = (b); \
(b) = __c; \
}
typedef struct PriorityQueue {
int* __data, * data;
int size, n;
} PriorityQueue;
PriorityQueue* initPQ(int size) {
PriorityQueue* p = (PriorityQueue*)malloc(sizeof(PriorityQueue));
p->__data = (int*)malloc(sizeof(int) * size);
p->data = p->__data - ROOT;
p->size = size;
p->n = 0;
return p;
}
int empty(PriorityQueue*