堆排序的时间复杂度

匿名 (未验证) 提交于 2019-12-02 23:43:01

1 引言

2 堆排序

大根堆,任意一节点的值小于子节点的值称为小根堆。一般来说,堆可以用一个一维数组A[n]A[n]表示。

2.1 基本操作

2.1.1 获取父、子节点

Θ(1)\Theta(1)
PARENT(i)

return i/2 

LEFT(i)

return 2i 

RIGHT(i)

return 2i+1 

2.1.2 维护堆的性质

ii的子树都是大根堆的情况下,使以ii为根节点的子树遵循大根堆的性质;此操作的伪代码如下:
MAX-HEAPIFY(A,i)

i = LEFT(i) r = RIGHT(i) if l <= A.heap-size and A[l] > A[i] 	largest = l else  	largest = i if r <= A.heap-size and A[r] > A[largest] 	largest  = r if largest != i 	exchange A[i] with A[largest] 	MAX-HEAPIFY(A,largest) 


Θ(1)\Theta(1);那么MAX-HEAPIFY对于子树的时间代价最多为多少呢,可以用如下递归式表示:
T(n)T(2n/3)+Θ(1)T(n) \leq T(2n/3) + \Theta(1)
其中Θ(1)\Theta(1)代表着其余非递归的操作,T(2n/3)T(2n/3)代表子树递归调用的最大值,因为每个孩子节点的子树最多为23n\frac{2}{3}n(当最底层恰好半满的时候)。


如上图,就是一个半满的完全二叉树,假设节点的右子树节点个数为2k12^k - 1,那么左子树节点个数为2k+112^{k+1} - 1,总节点个数为2k+2k+112^k + 2^{k+1} -1,左子树占总数的比例为:2k+112k+2k+11\frac{2^{k+1} - 1}{2^k + 2^{k+1} -1},当kk\rightarrow \infty时,这个比例为23\frac23。因此可以用表达式T(n)T(2n/3)+Θ(1)T(n) \leq T(2n/3) + \Theta(1)来刻画MAX-HEAPIFY操作的运行时间;根据主定理求解得到运行时间为T(n)=O(lgn)T(n)=O(lgn),即高为hh的堆的运行时间为O(h)O(h)

2.2 建堆

n2\lfloor \frac n2\rfloor以上的都是也治节点。因此建堆过程BUILD-MAX-HEAP的伪代码如下:
BUILD-MAX-HEAP(A)

A.heap-size = A.length for i = A.length/2 downto 1 	MAX-HEAPIFY(A,i) 

由上述伪代码中,每次调用MAX-HEAPIFY的时间为O(lgn)O(lgn),总共调用O(n)O(n)次,因此可以估算建堆的运行时间为O(nlgn)O(nlgn),但是很明显,这个上界不够精确。
hh的堆最多包含n2h+1\lceil \frac{n}{2^{h+1}} \rceil个节点;
hh的节点上运行MAX-HEAPIFY的代价是O(h)O(h),因此建堆(BUILD-MAX-HEAP)的总代价为:
h=0lgnn2h+1O(h)=O(nh=0lgnh2h)\sum_{h=0}^{\lfloor lgn \rfloor}\lceil \frac{n}{2^{h+1}} \rceil O(h)=O(n\sum_{h=0}^{\lfloor lgn \rfloor}\frac{h}{2^h})
其中有:h=0h2h=2\sum_{h=0}^{\infty}\frac{h}{2^h}=2(根据公式:k=0kxk=x(1x)2\sum_{k=0}^{\infty}kx^k=\frac{x}{(1-x)^2});
因此有:
O(nh=0lgnh2h)=O(nh=0h2h)=O(n)O(n\sum_{h=0}^{\lfloor lgn \rfloor}\frac{h}{2^h})=O(n\sum_{h=0}^{\infty}\frac{h}{2^h})=O(n)
O(n)O(n)

2.3 堆排序算法


HEAPSORT(A)

BUILD-MAX-HEAP(A) for i = A.length downto 2 	exchange A[1] with A[i] 	A.heap-size = A.heap-size - 1 	MAX-HEAPIFY(A, 1) 

其中,BUILD-MAX-HEAP运行时间为O(n)O(n),执行了n1n-1次MAX-HEAPIFY,每次时间为O(lgn)O(lgn),因此,堆排序的时间复杂度为O(nlgn)O(nlgn)

文章来源: https://blog.csdn.net/fugitive1/article/details/92656373
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!