堆排序算法
1、算法介绍
堆是一种数据结构,可以把堆看成一棵完全二叉树,这可完全二叉树满足:任何一个非叶子结点的值都不大于(或者不小于)其左右孩子结点的值。若父亲大孩子小,则叫做大顶堆,若父亲小孩子大,则叫做小顶堆。
根据堆的定义知道,代表堆的这棵完全二叉树的根结点的值是最大(或最小)的,因此将一个无序序列调整为一个堆,就可以找出这个序列的最大(或最小)值,然后将找出的这个值交换到序列的最后(或最前),这样有序序列元素增加1个,无序序列元素减少1个,对新的无序序列重复这样的操作,就实现了排序。这就是堆排序的思想。
堆排序最关键的操作就是将序列调整为堆的过程。整个排序过程就是通过不断调整使得不符合堆定义的完全二叉树变为符合堆定义的完全二叉树的过程。
2、执行过程
例如:
原始序列: 49 38 65 97 76 13 27 49
(1)建堆
先将这个序列调整为一个大顶堆。原始序列对应的完全二叉树如下图所示
在这个完全二叉树中,结点76、13、27、49是叶子结点,它们没有左右孩子,所以它们满足堆的定义。从97开始,按照97、65、38、49的顺序依次调整。
- 调整97。97>49,所以97和它的孩子49 满足堆的定义,不需要调整。
- 调整65。65>13,65>27,所以65和它的孩子13、27满足堆的定义,不需要调整。<