数据结构-堆(应用篇)之堆排序法-C和C++的实现
堆排序
关于堆的内容我们已经在上一节中了解了,本节中将给出一个堆的应用-堆排序。
关于堆的概念可以看上一节,入口:http://www.cnblogs.com/HongYi-Liang/p/7853649.html
堆排序属于一种选择排序:
步骤如下:
- 把待排序的数据构建成大顶堆(从大到小排序)。
- 把堆顶的数据拿出放在数组的第一个元素中。
- 使用下沉的方法整理堆中的数据。
- 循环第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++的实现的更多相关文章
- C 数据结构堆
引言 - 数据结构堆 堆结构都很耳熟, 从堆排序到优先级队列, 我们总会看见它的身影. 相关的资料太多了, 堆 - https://zh.wikipedia.org/wiki/%E5%A0%86%E7 ...
- 基本数据结构——堆(Heap)的基本概念及其操作
基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组 ...
- 【ZZ】堆和堆的应用:堆排序和优先队列
堆和堆的应用:堆排序和优先队列 https://mp.weixin.qq.com/s/dM8IHEN95IvzQaUKH5zVXw 堆和堆的应用:堆排序和优先队列 2018-02-27 算法与数据结构 ...
- java数据结构----堆
1.堆:堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都是O(logn),用堆实现的优先级队列虽然和数组实现相比较删除慢了些,但插入的时间快的多了.当速度很重要且有很多插入操作时,可以选择堆 ...
- 《github一天,一个算术题》:堆算法接口(堆排序、堆插入和堆垛机最大的价值,并删除)
阅览.认为.编写代码! /********************************************* * copyright@hustyangju * blog: http://blo ...
- 数据结构-堆 Java实现
数据结构-堆 Java实现. 实现堆自动增长 /** * 数据结构-堆. 自动增长 * */ public class Heap<T extends Comparable> { priva ...
- 数据结构 - 堆(Heap)
数据结构 - 堆(Heap) 1.堆的定义 堆的形式满足完全二叉树的定义: 若 i < ceil(n/2) ,则节点i为分支节点,否则为叶子节点 叶子节点只可能在最大的两层出现,而最大层次上的叶 ...
- Linux进程内存用量分析之堆内存篇
https://mp.weixin.qq.com/s/a6mLMDinYQGUSaOsGYCEaA 独家|Linux进程内存用量分析之堆内存篇 姬晨烜 58技术 2019-12-06 导语 本文将介绍 ...
- 二级py--day4 数据结构与算法篇
二级py--day4 数据结构与算法篇 1.算法的基本特征:可行性.确定性.有穷性.拥有足够的情报 2.算法的设计要求包括效率与低存储量,既要考虑算法的时间复杂度和空间复杂度 3.算法的优劣:与算法描 ...
随机推荐
- Python3.x和Python2.x的区别【转】
转载自:https://www.cnblogs.com/codingmylife/archive/2010/06/06/1752807.html 1.性能 Py3.0运行 pystone benchm ...
- linux 磁盘管理三部曲——(3)mount挂载,/etc/fstab配置文件
当我们分完区,并做好文件系统格式化,就到了最后的挂载mount了,挂载完毕就可以使用磁盘设备了. 一.什么是挂载,卸载 任何块设备都不能直接访问,需挂载在目录上访问 挂载: 将额外文件系统与根文件系统 ...
- intellij IDEA里各图标对应的文件类型
本篇内容为大家提供的是IntelliJ IDEA 使用教程中的常见文件类型的图标介绍,IntelliJ IDEA是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一, ...
- Grafana4.2安装
一.文件准备 1.1 文件名称 grafana-4.2.0-1.x86_64.rpm 1.2 下载地址 https://grafana.com/grafana/download 二.工具准备 2.1 ...
- React学习总结(一)
React学习总结 一.什么是React? 是Facebook公司开发的一套JS库 React的详细介绍https://www.jianshu.com/p/ae482813b791 二.老版本Reac ...
- 晒下我在2017年所阅读的JavaScript书单
前言 学习是一个持续不断的过程,在互联网技术里畅游的程序猿们,对学习的渴望更是难以穷尽.2017即将逝去,2018已经漏出曙光,回顾这一年,在学习的路上收获还是颇丰的,下面就晒一晒2017年我所学习的 ...
- VMware安装Linux,系统分区。
系统分区: 主分区<=4 扩展分区<=1 主分区+扩展分区<=4 扩展分区不能直接使用,必须再分成若干逻辑分区才能读写数据. 逻辑分区编号从5开始,1-4给主分区和扩展分区使用的,不 ...
- 【CSS3】动画animation-关键帧keyframes
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【Jenkins】通过ANT构建JMeter任务时提示找不到jtl文件时的解决方法
- Scrapy爬虫实例——校花网
学习爬虫有一段时间了,今天使用Scrapy框架将校花网的图片爬取到本地.Scrapy爬虫框架相对于使用requests库进行网页的爬取,拥有更高的性能. Scrapy官方定义:Scrapy是用于抓取网 ...