九大排序算法之堆排序(原理)

1、算法思路:堆是一种数据结构,可以把堆看成一棵完全二叉树,这棵完全二叉树满足:任何一个非叶子结点的值都不大于(或小于)其左右孩子结点的值。如父亲大孩子小叫大顶堆,若父亲小孩子大叫小顶堆。算法描述如下步骤:

1)从无序序列所确定的完全二叉树的第一个非叶子结点开始,从右至左,从下至上,对每个结点进行调整,得到大顶堆

2)将大顶堆变化得到的无序元素的第一个元素与最后一个元素交换位置。再次将剩余元素堆排序

3)重复上述步骤,直到树中仅含一个结点,结束。

2、算法过程

举个栗子(大顶堆一趟排序过程)

原始序列:49、38、65、97、76、13、27、49

1)建堆(原始序列对应的完全二叉树如下图)

2)在 这个完全二叉树中结点76、13、27、49都是叶子结点,无孩子结点满足堆定义,从97开始,按97、65、38、49依次调整次序。

3)调整97:97>4,满足堆定义,无需调整

4)调整65:65>13,65>27,满足堆定义,无需调整

5)调整38:38<97,38<76,不满足堆定义,需要调整,在这里比较38两个孩子结点值都比38大,取最大值交换,和97交换后,38成为49的父结点,不满足堆定义,因此再次和49交换位置,得到结果如下图:

6)调整49:49<97,49<65,不满足堆定义,需要调整,在这里比较49两个孩子结点值都比49大,取最大值交换,和97交换后,49成为49和76的父结点,49<76,不满足堆定义,因此再次和76交换位置,得到结果如下图:

7)如上图已经建立好一个大顶堆,对应的序列是97、76、65、49、49、13、27、38,将97与序列最后一个元素38交换位置得到一趟排序结果:38、76、65、49、49、13、27、97,97到达最终位置,在对除 97外其余元素进行堆排序,直到树中只剩一个结点时排序完成。

猜你喜欢

转载自blog.csdn.net/changhangshi/article/details/82757927
今日推荐