最小堆定义:
完全二叉树,且其任意节点键值小于其左子树所有节点和右子树所有节点。堆顶总是保存堆的最小值。
堆的表示:
堆是完全二叉树,所以可以用数组表示堆。设数组heap[n]为堆,heap[1]表示根节点,对于除根节点外的任意节点heap[i],其父节点为heap[i/2],其左儿子为heap[i*2],右儿子为heap[i*2+1]。
堆的操作:
heapify(heap,i):若节点heap[i]左子树和右子树都满足最小堆的性质,而heap[i]节点不满足最小堆性质,即heap[i]>heap[i*2]或者heap[i]>heap[2*i+1],则操作heapify(heap,i)调整heap[i]的位置来保持堆的性质。这是堆的基本操作。
heapinsert(heap,val):往堆里面插入值val,新增节点heap[n+1]=val,并比较新增节点和其父节点大小,不断调整新增节点的位置,保持最小堆的性质。
heappop(heap):弹出堆顶元素,并令heap[0]=heap[n],堆大小减一,之后执行heapify(heap,0)来维持堆的性质。
堆排序和优先队列:
由上述堆的基本操作基本可以实现堆排序和优先队列。
堆排序:1,在线算法,不断heapinsert接受所有的数据后,heappop输出所有数据
2,离线算法,利用heapify操作创建最小堆,heappop输出所有数据
优先队列:heapinsert插入优先队列,heappop弹出优先队列