选择排序之堆排序

来源:互联网 发布:南望王师又一年 知乎 编辑:程序博客网 时间:2024/06/06 03:45

  堆排序(HeapSort)是利用堆积树这种数据结构所设计的一种排序算法,他是选择排序的一种,其存储结构类似于完全二叉树:

二叉堆满足的性质:

  1父节点的值总是大于或者等于(小于或者等于)孩子节点的值的

  2.每个节点的·左右子树都是一个二叉堆。

当父节点的值大于或者等于任意一个子结点的值时,则成为大根堆;当父节点总是小于或者等于任意一个叶子节点的值时则被称为小根堆。如下图所示:

左边为小根堆,右边为大根堆。



对的存数结构一般采用数组,如下图所示。节点下标和在数组里面的值一一对应。

typedef struct{    KeyType key;} RedType;typedef struct{    RedType r[SIZE + 1];    int length;} SqList;


堆的创建:

  例如:对上图的大根堆进行排

将49与08交换,然后对余下的几个数据(不包括49)重新构建大根堆然后将堆顶元素与倒数第二个元素交换,重新构建大根堆。然后重复上述操作,直到堆顶为最小元素。这样利用大根堆进行升序排序就完成

下面是大根堆的实现代码

void HeapAdjust(HeapType & H, int s, int m){    RedType rc;    rc=H.r[s];    for(int j=2*s;j<=m;j++)    {        if(j<m&&H.r[j].key<H.r[j+1].key)            j++;        if(rc.key>H.r[j].key)            break;        H.r[s]=H.r[j];        s=j;    }    H.r[s]=rc;}
调整堆,将其排列成大根堆,一次操作只能保证堆顶元素为最大元素。将堆顶元素与当前最大的元素交换。然后在后面的操作中去掉这个元素

void HeapSort(HeapType & H){    int temp;    for(int i=H.length/2;i>0;i--)        HeapAdjust(H,i,H.length);for(int j=H.length;j>1;j--){temp=H.r[1].key;H.r[1].key=H.r[j].key;H.r[j].key=temp;HeapAdjust(H,1,j-1);}}



20 0