堆排序的完整过程

来源:互联网 发布:山脉户外 知乎 编辑:程序博客网 时间:2024/06/05 15:49

本文是对兰亭风雨大牛的堆排序文章的补充,方便自己回头复习,可以在看完其文章后再看这篇博文。

输入A[0,1,2......n-1]

堆排序的完整过程(以从小到大排序为例,选用最大堆):

一.建堆:我们可以把叶子节点当作堆,在叶子节点的基础上添加非叶子结点,并调整,过程与调整堆一样。

这里要注意数组下标是从0开始,所以节点(i)的左右子节点下标分别为2*i+1,2*i+2。并且第一个非叶子结点下标为

len/2-1.

二.调整堆:原数组建好堆后,将堆顶元素A[0]与堆中最后一个元素A[n-1]交换位置,再调整A[0,1,2....n-2]为最大堆

三.重复第二步,直到还剩下一个元素为止,此时A[0,1,2......n-1]便是从小到大排好序的数组了,并且没有占用额外空间

这里以A=1,3,5,6,2,9,7,4为例,我们看一下完整过程 :

建堆:

第一个非叶子结点下标为len/2-1=8/2-1=3,A[3]=6,所以6以后的2,9,7,4均是叶子节点,可以把这四个节点看成是一个堆,

并且6的左孩子下标为2*3+1=7,A[7]=4.

1.把6插入2,9,7,4组成的堆中



2.将5插入新堆中,5的左右孩子分别为9,7,并调整为新的堆(从9,7中选择较大值与5交换位置),如下:


3.将3插入新堆中,3的左右孩子分别为6,2,并调整为新的堆(从6,2中选择较大值与3交换位置,再从当前3所在位置的左右孩子中选择较大与3替换),如下:


同理将1插入,这样最大堆就建立完毕了


调整堆:

将A[0]=9与A[7]=3,交换位置,则A[7]保存整个堆中最大元素,将剩下元素调整为最大堆


重复这个过程最后A[0,1.....n-1]就是从小到大排好序的数组了


0 0
原创粉丝点击