堆排序

关于堆的内容我们已经在上一节中了解了,本节中将给出一个堆的应用-堆排序。

关于堆的概念可以看上一节,入口:http://www.cnblogs.com/HongYi-Liang/p/7853649.html

堆排序属于一种选择排序:

步骤如下:

  1. 把待排序的数据构建成大顶堆(从大到小排序)。
  2. 把堆顶的数据拿出放在数组的第一个元素中。
  3. 使用下沉的方法整理堆中的数据。
  4. 循环第2,3步,直到堆中所有数据都取出来为止。

这个算法的优缺点如下

优点:时间复杂度低,其中建立堆最多循环了nlong2(n)/2次,时间复杂度为O(nlog2(n)),同样后面重新排序的时间复杂度为O(nlong2(n)),所以整个算法的复杂度为O(nlog2(n))。

缺点:需要建堆,操作繁琐。

综上所述,本排序算法适合排列大量数据时使用。


C语言

取出堆顶元素并把它从堆中删除:

bool MaxHeap_getTopAndMoveIt(MaxHeap *heap,MAXHEAP_ELEM *elem)
{
*elem = heap->iDatas[];
MaxHeap_pop(heap,);
return true;
}
  • MaxHeap_pop()函数为从堆中删除某个数。在上一节中讲过这里不再赘述。

堆排序:

bool HeapSort(MAXHEAP_ELEM buff[],int length)
{
int i;
MaxHeap heap={};
if(length<=)
return false;
MaxHeapConstructByBuffer(&heap,buff,);
for(i=;i<length;i++)
{
MaxHeap_getTopAndMoveIt(&heap,&buff[i]);
}
MaxHeapDesturct(&heap); return true;
}
  • MaxHeapConstrucByBuffer()函数的作用是把buff[]中的数据建立成堆。在上一节中讲过这里不再赘述。
  • MaxHeap_getTopAndMoveIt()函数的作用是取出堆顶的元素并放在buff[]的最前边。在堆中,堆顶的的元素为最大值。

测试:

使用堆排序的方法将buffer中的数据从大到小排列:

int main()
{
int i;
int buffer[]={,,,,,,,,,}; HeapSort(buffer,);
for(i=;i<;i++)
{
printf("%d ",buffer[i]);
} system("pause");
return ;
}

程序运行结果:

数据结构-堆(应用篇)之堆排序法-C和C++的实现的更多相关文章

  1. C 数据结构堆

    引言 - 数据结构堆 堆结构都很耳熟, 从堆排序到优先级队列, 我们总会看见它的身影. 相关的资料太多了, 堆 - https://zh.wikipedia.org/wiki/%E5%A0%86%E7 ...

  2. 基本数据结构——堆(Heap)的基本概念及其操作

    基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组 ...

  3. 【ZZ】堆和堆的应用:堆排序和优先队列

    堆和堆的应用:堆排序和优先队列 https://mp.weixin.qq.com/s/dM8IHEN95IvzQaUKH5zVXw 堆和堆的应用:堆排序和优先队列 2018-02-27 算法与数据结构 ...

  4. java数据结构----堆

    1.堆:堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都是O(logn),用堆实现的优先级队列虽然和数组实现相比较删除慢了些,但插入的时间快的多了.当速度很重要且有很多插入操作时,可以选择堆 ...

  5. 《github一天,一个算术题》:堆算法接口(堆排序、堆插入和堆垛机最大的价值,并删除)

    阅览.认为.编写代码! /********************************************* * copyright@hustyangju * blog: http://blo ...

  6. 数据结构-堆 Java实现

    数据结构-堆 Java实现. 实现堆自动增长 /** * 数据结构-堆. 自动增长 * */ public class Heap<T extends Comparable> { priva ...

  7. 数据结构 - 堆(Heap)

    数据结构 - 堆(Heap) 1.堆的定义 堆的形式满足完全二叉树的定义: 若 i < ceil(n/2) ,则节点i为分支节点,否则为叶子节点 叶子节点只可能在最大的两层出现,而最大层次上的叶 ...

  8. Linux进程内存用量分析之堆内存篇

    https://mp.weixin.qq.com/s/a6mLMDinYQGUSaOsGYCEaA 独家|Linux进程内存用量分析之堆内存篇 姬晨烜 58技术 2019-12-06 导语 本文将介绍 ...

  9. 二级py--day4 数据结构与算法篇

    二级py--day4 数据结构与算法篇 1.算法的基本特征:可行性.确定性.有穷性.拥有足够的情报 2.算法的设计要求包括效率与低存储量,既要考虑算法的时间复杂度和空间复杂度 3.算法的优劣:与算法描 ...

随机推荐

  1. Java基础(四)-异常处理机制及其设计

    本篇主要是记录自己所理解的Java异常处理机制(基于jdk1.7)以及怎么去处理和设计异常.还记得当初学习Java异常这块的时候都没怎么注意它的用途,以为就是简单的处理下异常,我避免程序出现这样错误就 ...

  2. 在windows平台使用Apache James搭建邮件服务器以及使用C#向外网发送邮件

    首先环境搭建: 1.下载安装JDK,并且配置环境变量 2.下载Apache James ,下载解压之后的目录如图 双击bin下边的run.bat批处理文件安装James 服务,提示如下信息说明安装成功 ...

  3. 安装Redis后RedisDesktopManager无法连接

    1.查看端口,发现端口不通 2.修改安装redis的目录的redis.conf文件,把bind改为虚拟机的本机ip 3.关闭虚拟机的防火墙 #1.查看防火墙状态[root@localhost src] ...

  4. 45、SQL逻辑查询语句执行顺序

    一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...

  5. MySQL数据库常见操作

    数据库连接与关闭:mysql -h 服务器主机地址 -u 用户名 -p 用户密码 创建新用户并授权:grant 权限 on 数据库.数据表 to 用户名@登录主机 identified by &quo ...

  6. 挑战App Store,微信通过“跳一跳”秀了一下“小程序”的肌肉

    2017年即将结束的时候,微信放了一个大招.随着最新的微信v6.6.1版本更新,基于小程序的"小游戏"板块正式上线.微信上首发的这款"小游戏"叫"跳一 ...

  7. 一张图讲清楚TCP流量控制

  8. mysql创建新用户及新用户不能本地登陆的问题

    最近在搭建hadoop集群,主节点上面安装的MySQL数据库,对着方面不熟悉,为hive.Ooize等服务统一使用的root账号和密码,为了安全一些库对于某些用户是不可见的,所以需要针对不同的服务设置 ...

  9. bzoj 3669: [Noi2014] 魔法森林 LCT版

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  10. bzoj 2726: [SDOI2012]任务安排

    Description 机 器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的 若干任务.从时刻0开始,这 ...