算法之堆排序

来源:互联网 发布:贝叶斯学派全知理论 编辑:程序博客网 时间:2024/06/06 08:39

先说:

   之前听了算法课,讲到了堆排序。当时以为自己懂了,然后看软考题的时候发现自己好像没懂。后来才知道我之前只理解了一半,我只理解到了堆的建立,却不知道堆的建立只是开始排序的明明确确第一步。所以在此特地写一下步骤及具体排序过程帮别人明白。也整理一下自己的思维。

          

    假设以下为待排序数字: 1355884027349265

 

       步骤一:首先先把他们按照二叉树的形状放好,如图:

            

                    

              

 

       步骤二:调成最小堆 ,调成最小堆也要一步一步来,以下调成最小堆用()来表示步骤:

         看1-1图,因为最小堆的意思是根节点比它所有的子节点都要小因此图1-2中,1节点的数值要比2和3节点小; 左子树的2节点要比它的两个子节点4,5小;同样右子树3要比它的两个子树6,7小;4节点要比它的子节点8小

              

       当然以上说的是最小堆的情况,目前按照图1-1来说,完全不符合规则,因此我们要建堆。

    (1)首先看的是总的根节点, 因为13比55和88小,所以不用挪动;

   如图:

                

     

(2)再看左子树,因为55比40,和27小,而40比27大,所以把55和27换一下;再把40和它的子节点相比,因为40小于65,因此不用动;

如图:

                 


(3)再看右子树,因为88比它的左个子节点34大,因此要换一下位置。至此最小堆已经建成了

 

如图:


     既然最大堆已经完成了,那么就要开始排序了,是的,没错,你以为完了,其实才刚刚开始而已。接下来才是非常重要的,就是输出栈顶元素。

      步骤三:因为建立起了最小堆,所以栈顶是最小的了,那么排序的过程就是

     (1)把栈顶元素13拿出来,把最后一个元素92放到栈顶13的位置(如下图),但是这样一来,就会造成堆的混乱,它就不是最小堆了,于是我们还得再一次建堆,92比40和27大,40比27大,所以92要和27换,但是92和自己的两个子节点相比,又很大,所以必须交换,因为左子节点34比右子节点65小,所以92要和34交换,至此,又建成了一个最小堆。

           

(2)接下来按照步骤一再来一遍,把新建成的最小堆的栈顶元素27拿出来,这是这个堆排序的有序区里面的第二个


                

(3)然后再把再一次重建好的最小堆的栈顶元素输出,把34拿出来,把92放上去,因为92比40和65大,且40比65小,所以92和40交换。92又比他的55和88两个子节点大,因此92和55换,所以最终有以下情况

            

4)现在继续输出重建好的最小堆的栈顶元素,将92放在40的位置,然后发现925565大,5565小,所以把9255换下位置,这又是重建好的一个最小堆

           

   

 

      5)将55元素输出,放在有序区内,这次再把92放到栈顶,因为928865大,且8865大,因此让92和比较小的数字交换,于是有以下情况:

           

      

   

6)将65输出,把92放到65的位置,因为8892小,所以有以下情况:

      

             



总结:这就是堆排序了,至于代码,去网上搜一下吧,有的是。啧啧啧。这就是我的博客了,写的时候也让自己更加明白了,大概这就是总结博客的重要性吧,最后,放一张银时的图,希望大家都快乐

             

 
























                       

原创粉丝点击