标题: 十大经典排序算法之堆排序(Java语言) [打印本页] 作者: 杨利霞 时间: 2020-4-23 15:00 标题: 十大经典排序算法之堆排序(Java语言) - r) P9 E* N m& d- i6 d* P 十大经典排序算法之堆排序(Java语言)- D. P& J5 h ]5 L7 I9 P
文章目录* ~# g X: a' N0 _1 k
1 E- B: z ^, F$ t( I" u什么是堆 @) A4 `' E* p6 v如何进行堆排序呢4 Q' T! W7 W: Q# H0 D$ n: @8 |
用数组构建一个堆 % }# _! Y- ?7 S0 a9 Z# a N上代码 9 W+ h3 l& S0 D. ~9 w# M* M' K什么是堆/ x: O$ N& D9 h! n( i" J9 R0 l
$ b: q7 l% o* S$ K# ?$ r5 c8 j% S0 a
在了解什么是堆之前一定要先了解什么是完全二叉树 4 m# M q6 j& u# s看一下百度百科的介绍1 T$ u- ^ z& b R ?; t4 w
4 Y/ P/ e1 T4 w) Q8 Z+ h. r若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。 6 q9 E3 Z% l- r. H! i8 G/ ~百度百科拗口版性质介绍,能看懂上面的就行,下面的大概看下 . A. T6 Z" `4 f& }" p) ` 6 k. `6 j( {9 m) q2 Z完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。$ R6 p$ o1 s+ d ]
(1)所有的叶结点都出现在第k层或k-l层(层次最大的两层)( x3 z/ d* K* Q) f( a, p9 {- N
(2)对任一结点,如果其右子树的最大层次为L,则其左子树的最大层次为L或L+l。 9 Y% @9 T# r0 |一棵二叉树至多只有最下面的两层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边的若干结点缺失的二叉树,则此二叉树成为完全二叉树。 " }- _% g) c/ v/ j$ c# c那么在了解到什么是完全二叉树之后,我们再来看什么是堆 - }8 c4 ]2 s; Z堆有以下两个性质 7 l7 g2 `1 Z( D0 p* d/ Q , E. [! {2 A' ]2 B0 F+ \+ l1 堆中某个节点的值总是不大于或不小于其父节点的值;+ E, @- y& P* U u2 R/ A8 ]
2 堆总是一棵完全二叉树。 . e! [, [6 G6 K; P1 }其中堆顶就对应二叉树的根 & p( n k$ A0 i) J) [ ) M) l, e, X% V1 d1 g3 M! J堆又分为大顶堆和小顶堆,根据堆的第一个性质来进行区分3 F0 ?5 M* _* i9 \! V- B0 @
' c1 M" I0 U: X3 n T+ H
当堆中某个节点的值总是大于它的子节点的时候这个堆为大顶堆,反之为小顶堆4 s. {( n& z: a1 r% y
如何进行堆排序呢; m0 q+ h" ]5 R1 M