博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆排序算法
阅读量:6586 次
发布时间:2019-06-24

本文共 1629 字,大约阅读时间需要 5 分钟。

hot3.png

堆是什么

堆是一种用完全二叉树表示的数据结构,其特点是父节点比子节点大(若是大顶堆,以下若无特殊说明均指大顶堆

堆排序算法

堆排序算法是利用堆的性质进行排序的一种算法,其大致的原理是,把待排序数组先建立成一个大顶堆, 然后把最后一个节点和第一个节点交换,把交换后的最后一个节点从堆中剔除,此时从堆顶开始,若根节点小于它最大的子节点,就跟这个子节点换位(根节点下沉,子节点上升,即保持父节点大于子节点的性质),此时再把下沉下来的根节点看作是所在子树的根节点,重复刚刚的步骤直到堆的末尾,这样就完成了堆排序。
具体代码如下:

/*  输入:数组A,堆的长度hLen,以及需要调整的节点i  功能:调堆*/void AdjustHeap(int A[], int hLen, int i){    int left = LeftChild(i);  //节点i的左孩子    int right = RightChild(i); //节点i的右孩子节点    int largest = i;    int temp;    while(left < hLen || right < hLen)    {        if (left < hLen && A[largest] < A[left])        {            largest = left;        }        if (right < hLen && A[largest] < A[right])        {            largest = right;        }        if (i != largest)   //如果最大值不是父节点        {            temp = A[largest]; //交换父节点和和拥有最大值的子节点交换            A[largest] = A[i];            A[i] = temp;            i = largest;         //新的父节点,以备迭代调堆            left = LeftChild(i);  //新的子节点            right = RightChild(i);        }        else        {            break;        }    }}/*  输入:数组A,堆的大小hLen  功能:建堆*/void BuildHeap(int A[], int hLen){    int i;    int begin = hLen/2 - 1;  //最后一个非叶子节点    for (i = begin; i >= 0; i--)    {        AdjustHeap(A, hLen, i);      }}/*  输入:数组A,待排序数组的大小aLen  功能:堆排序*/void HeapSort(int A[], int aLen){    int hLen = aLen;    int temp;    BuildHeap(A, hLen);      //建堆    while (hLen > 1)    {         temp = A[hLen-1];    //交换堆的第一个元素和堆的最后一个元素         A[hLen-1] = A[0];         A[0] = temp;         hLen--;        //堆的大小减一         AdjustHeap(A, hLen, 0);  //调堆    }}

算法效率

最好或者最坏情况下,堆排序的运行时间都是O(nlogn)

转载于:https://my.oschina.net/LinJeffrey/blog/55301

你可能感兴趣的文章
基于LVS的DR模式实现PHP应用
查看>>
js css 压缩之 minify
查看>>
Excel表格模板:某专业详细情况登记表下载
查看>>
for /f
查看>>
浅谈国密算法
查看>>
mysql日志
查看>>
Entity Framework 动态构造select表达式
查看>>
RISC-V双周简报0x1f:一晚上写个RISC-V处理器玩玩(2018-09-01)
查看>>
SDL安装
查看>>
视频营销:上传视频之后着重分析调整这5个因素
查看>>
PHP面向对象之方法的重写or重载
查看>>
提取mariadb(mysql) 报错日志并自动邮件上报告警内容
查看>>
linux文件系统扩展属性
查看>>
Apache的ProxyPass简单使用
查看>>
redis.conf参数配置文件详解
查看>>
VMware vSphere中三种磁盘规格(厚置备延迟置零\厚置备置零\Thin Provision
查看>>
超级详细Tcpdump 的用法
查看>>
chmod
查看>>
协议森林
查看>>
认识Hystrix
查看>>