《算法导论》学习分享——6. 堆排序

6. 堆排序

堆排序也是一种时间复杂度为 O ( n lg ⁡ n ) \Omicron (n\lg n) O(nlgn)的排序算法,但是与归并排序不同的是堆排序是一种原址排序,也就是说排序过程只是交换数据的位置。

最大堆

是一个数组,存储一个近似完全二叉树,树上的每个结点对应数组中的一个元素,数组第一个元素存储根节点,第i个元素的左孩子在数组的2i位置,右孩子在数组的2i+1位置,父结点在数组的i/2位置。
06_HEAP

最大堆指一种父节点必然大于等于子节点的。下图为一个最大堆的存储情况:

06_1

MAX-HEAPIFY(维护最大堆)

MAX-HEAPIFY是维护最大堆性质的重要方法。MAX-HEAPIFY的输入为数组A和下标i,当调用MAX-HEAPIFY时,假定根节点为LEFT(i)和RIGHT(i)的二叉树都是最大堆,但是A[i]可能比它的子节点要小。MAX-HEAPIFY通过让A[i]的值在最大堆中逐级下降,从而使得以下标i为根节点的树符合最大堆的性质。以下是MAX-HEAPIFY的伪代码以及MAX-HEAPIFY(A, 2)的处理过程:

06_MAX_HEAPIFY
06_2

因为堆的高度为 lg ⁡ n \lg n lgn,所以该过程的时间复杂度是 O ( lg ⁡ n ) \Omicron (\lg n) O(lgn).

建堆

自下而上的调用MAX-HEAPIFY可以把一个数组转换为最大堆。
叶子节点不需要调用,所以从下标为n/2的的元素开始,一直到根节点。
伪代码和建堆过程如下:

06_BUILD_MAX_HEAP
06_3

堆排序

  1. 利用BUILD-MAX-HEAP方法构建最大堆
  2. 接着循环的堆的根节点和最后一个元素交换
  3. 堆的大小减一
  4. 调用MAX-HEAPIFY(A, 1)
  5. 循环2-4步,直到堆中只剩根节点

伪代码,以及2-5步过程如下:

06_HEAP_SORT.PNG
06_4.PNG

优先队列

堆除了堆排序还有很多应用,比如优先队列。优先队列也有两种最大优先队列和最小优先队列。
一个最大优先队列支持以下操作:

	INSERT(S, x)
	MAXIMUM(S)
	EXTRACT-MAX(S)
	INCREASE-KEY(S, x, k)

最大优先队列的应用有很多,其中一个是在共享计算机系统的作业调度。最大优先队列记录将要执行的各个作业及他们之间的相对优先级。
最小优先队列可以被用于基于事件驱动的模拟器。队列中保存要模拟的事件,每个事件都有一个发生时间作为其关键字。

涉及算法

点击查看实现

习题答案

思考题

Github Source: https://github.com/maomao9003/Introduction-to-Algorithms/blob/master/Docs/Chapter/6.堆排序.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值