关闭

堆排序的代码实现与思考

标签: 堆排序数据结构二叉树
132人阅读 评论(0) 收藏 举报
分类:

堆的定义如下:n个元素的序列{k1,k2,…,kn}当且仅当满足以下关系时,称之为堆。

这里写图片描述

若将和此序列对应的一维数组看成一个完全二叉树,即堆的含义表明安全二叉树中所有非终端节点的值均不大于(或不小于)其左右孩子节点的值。堆顶元素则必是堆顶最大值或最小值。

具体的分析在严蔚敏的《数据结构》上已经说的很清楚很明白了。作为总结,说一下在代码实现中需要注意的两点。
第一,无序序列构造堆,方向是从叶子节点到根节点结束,所以要从第一个非叶子节点开始进行构造,即从L.length/2的位置开始。
第二,每个位置进行交换之后,可能会导致该子树不再是堆,所以还要对子树进行调整。
以上两点说完就上代码:

#include<iostream>
using namespace std;
const int  MAXSIZE (20);
typedef struct
{
    int r[MAXSIZE+1];
    int length;
}sqList;
void HeapAdjust(sqList &L,int s,int m)
{
    int rc=L.r[s];
    for(int j=2*s;j<=m;j*=2)
    {
        if(j<m&&L.r[j]>L.r[j+1]) ++j;
        if(L.r[s]<=L.r[j]) break;
        int temp=L.r[s];
        L.r[s]=L.r[j];
        L.r[j]=temp;
        s=j;
    }
    L.r[s]=rc;


}
int main()
{
    sqList L;
    L.r[1]=49;
    L.r[2]=38;
    L.r[3]=65;
    L.r[4]=97;
    L.r[5]=76;
    L.r[6]=13;
    L.r[7]=27;
    L.r[8]=49;
    L.length=8;
    //构造堆
    for(int i=L.length/2;i>0;--i)
        HeapAdjust(L,i,L.length);

    //堆排序
    for(int i=L.length;i>=1;--i)
    {
        cout<<L.r[1]<<" ";
        L.r[1]=L.r[i];
        HeapAdjust(L,1,i-1);
    }
    return 0;
}
0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16847次
    • 积分:483
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条