堆排序详解(java实现)

什么叫堆排序     

           堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i].
什么是完全二叉树
    
         若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树.

完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树.
一棵二叉树至多只有最下面的一层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边的若干结点缺失的二叉树,则此二叉树成为完全二叉树.

其实说白了,就是把数据从左到右放,一层放满了就放下一层,最后形成的二叉树结构叫做完全二叉树.

如何实现?

    拿到一个数组,当成完全二叉树看待.(自己想象数据在完全二叉树中的位置,从左往右放),注意,只是当成,当成.
要想排序(这里用顺序说明),得每次排序完过后,根节点是所有元素中最大的一个,然后把这个元素与最后一个元素交换,这样,第一次排序过后,数组最后一个元素是最大的了,然后在排序,排序的元素的个数-1,再重复.

具体细节

    拿到一个数组,得知道从哪里开始比较啊,已知元素的索引为index,则它的父节点的索引为(index - 1) / 2,然后我们需要知道最后一个元素的父节点,因为得从这个节点开始排序,最后一个元素索引为n - 1,所以它的父节点的索引为n / 2 - 1.已知元素索引求左右字节点就反着算.
代码
    因为牵涉到交换元素的问题,所以先把交换元素的方法写好


    然后实现根节点为最大的方法


这样就能排一个元素了,然后再用循环排完所有元素.


需要的方法就写完了,最后测试一下(这里就测试10个,多少个都一样,只是结果不好显示).


测试结果.