最小堆(小根堆)

最小堆定义:

完全二叉树,且其任意节点键值小于其左子树所有节点和右子树所有节点。堆顶总是保存堆的最小值。

堆的表示:

堆是完全二叉树,所以可以用数组表示堆。设数组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弹出优先队列

点赞