选择排序——堆排序

Posted 二狗Code俱乐部

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择排序——堆排序相关的知识,希望对你有一定的参考价值。

堆排序

选择排序中我们之前主要讲了简单选择排序,因为堆排序稍微复杂些,我们就介绍它。

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 选择排序——堆排序

<选择排序和简单选择排序>

1不过在次之前还是要先介绍下选择排序和简单选择排序。

之前有一篇推送大体介绍了各式各样的排序。主要的几个大类就是

a插入排序:直接插入排序、折半插入排序、希尔排序

b交换排序:冒泡排序、快速排序

c选择排序:简单选择排序、堆排序

我们之后会找时间介绍希尔排序和快速排序。

 

2选择排序的基本思想:每一趟,从没有排好的元素里面挑一个到有序的子序列中来,也就是每一趟都确定了一个元素的最终全局位置。直到待排序元素只剩下一个,就不用再选了。

3简单选择排序算法の伪代码as follow:

       voidSelection(Elemtype A[],int n){

              //依次从后面序列中选择当前最小元素作为第i个元素

              //最后一个元素不需要排序

              for(i=0;i<n-1;i++){

                     min=i;             //记录最小元素位置

                     for(j=i+1;j<n;j++)//从第i个元素往后找,一直要找到最后一个元素

                            if(A[j]<A[min])min=j;  //如果这个值更小,则更新min值为这个更小的元素所在下标

                     if(min!=i)  swap(A[i],A[min]); //如果第i个元素不是剩下元素最小的,则和最小的进行交换。

              }

       }

 

 

<堆排序>

还是用最亲和,最接地气的方式讲这些东西。这样也好在和别人交流的时候能够快速的让人明白,不至于给人故弄玄虚,故作高深的柑橘。其实还是很好懂的。

1 what is 堆?怼? √

一个是大根堆,一个是小根堆,大头儿子小头爸爸。

大根堆就是把最大元素放在根结点中,对于任一非根结点,它的值小于等于其双亲结点。

小根堆把最小元素放入根结点中……

2构造初始堆的过程。

排序关键就是构造初始堆。n个结点的完全二叉树,最后一个结点是第[n/2],这里是向下取整。比如有8个元素,n=8.先找到第8/2=4个结点的左右孩子,看看是不是孩子比这个结点大,大的话就把孩子换上来。总之要调整,我们要适应社会,而不是社会来适应每个结点。社会就像大根堆一样,有它的社会规则,成文的也好,不成文的也罢。然后接着i=3,i=2,i=1结点进行调整。直到成为堆为止。

 

上面写一大堆不知所云,直接上图把,罗里吧嗦。比如这么些数据待排序{48623577551435*98}

选择排序——堆排序

fig1构建大顶堆,可以自行推导小顶堆

选择排序——堆排序

fig2继续调整,好事多磨。

fig3一鼓作气,再而衰,三而竭。曹刿(gui)论战

fig4 finally.

 

3构建大根堆的算法

       voidBuildMaxHeap(ELemType A[],int len){

              for(inti=len/2;i>0;i--)  //i=[n/2]~1,反复调整堆

                     AdjustDown(A,i,len);

       }

 

       voidAdjustDown(ELemType A[],int k,int len){

              //函数AdjustDown将元素k向下调整

              A[0]=A[k];   //A[0]暂存

              for(i=2*k;i<=len;i*=2){   //沿key较大的子结点向下筛选

                     if(i<len&&A[i]<A[i+1])

                            i++;              //key较大的子结点的下标

                     if(A[0]>=A[i])break; //筛选结束

                     else{

                            A[k]=A[i];        //A[i]调整到双亲结点上

                            k=i;              //修改k,以便继续向下筛选

                     }  

 

              }//for

              A[k]=A[0];    //被筛选的结点值放入最终位置

       }

 

4怎么利用大根堆来排序呢?

首先构建大根堆。就是我们刚刚所做的。那么堆顶元素就是最大值。输出这个堆顶元素。再将堆底元素送入堆顶,这时就破坏的大根堆的性质。所以我们又开始了不断深化改革。为了保持socialism的性质而奋斗,直到最后只剩下一个元素为止!!!


以上是关于选择排序——堆排序的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(简单选择排序堆排序的算法思想及代码实现)

排序算法之选择排序(简单选择排序堆排序)

十大经典排序之:选择排序 |堆排序

排序 选择排序&&堆排序

七大排序之:直接选择排序和堆排序

算法2 排序算法:直接选择排序和堆排序