堆排序算法
思路:
先将序列构成一个大顶堆,然后将将第一个元素和剩余大顶堆的最后一个元素调换,然后将然后元素数再-1,再将剩下的调整为大顶堆,一直循环,具体思路见代码注释。

注:堆排序的时间复杂度为O(nlogn),性能上远远好过于冒泡、简单选择、直接插入排序,但是由于记录的比较与交换是跳跃式的,因此堆排序是一种不稳定的排序方法。

代码实现:

//堆排序(排序后为从小到大)
#include <iostream>
#include <algorithm>
using namespace std; void HeapAjust(int (&a)[9], int s, int m){int tmp, j;tmp = a[s];//记录此时的结点sfor (j = 2 * s; j <= m; j *= 2){//如果它不是根结点,即如果(j=2*s)<=m满足if (j < m&&a[j] < a[j + 1]){//如果它有右子树且右子树的值大,++j++j;}if (tmp >= a[j]){//如果刚开始的结点s的值比这个大,就不执行break;}a[s] = a[j];//否则,就将结点s的值和结点j的值进行调换s = j;}a[s] = tmp;
}void HeapSort(int (&a)[9]){//数组作为引用形参传入,使用在此修改对原数组也有效int asize = sizeof(a) / sizeof(a[0]);//取数组的大小 int i;for (i = asize / 2-1; i >= 0; --i){//先这个序列调整为大顶堆HeapAjust(a, i, asize-2);}for (i = asize - 1; i > 0; --i){swap(a[0], a[i]);//将第一个元素和剩余大顶堆的最后一个元素调换HeapAjust(a, 0, i - 1);//将然后元素数再-1,然后再将剩下的调整为大顶堆}
}int main(){ int a[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };cout << "before sorted:" << endl;for (size_t i = 0; i < 9; ++i){//输出 cout << a[i] << " ";}cout << endl;HeapSort(a);cout << "after sorted:" << endl;for (size_t i = 0; i < 9; ++i){//输出cout << a[i] << " ";}cout << endl;return 0;
}

运行结果:

HeapSort 堆排序相关推荐

  1. JavaScript实现heapsort堆排序算法(附完整源码)

    JavaScript实现heapsort堆排序算法(附完整源码) Heap.js完整源代码 MinHeap.js完整源代码 Comparator.js完整源代码 Sort.js完整源代码 HeapSo ...

  2. 排序算法(5)----堆排序

    这篇博客从以下几个方面来说: 什么是最大堆以及代码实现 堆排序基础代码 一次优化(提高效率) 二次优化(原地堆排序,无需额外空间) 1.什么是最大堆以及代码实现 这里可以参考言简意赅的博客:堆与最大堆 ...

  3. c语言顺序存储构建一棵二叉树,C语言 数据结构堆排序顺序存储(升序)

    堆排序顺序存储(升序) 一: 完全二叉树的概念:前h-1层为满二叉树,最后一层连续缺失右结点! 二:首先堆是一棵全完二叉树: a:构建一个堆分为两步:⑴创建一棵完全二叉树      ⑵调整为一个堆 ( ...

  4. 经典排序算法之:堆排序

    背景及原理 1991年的计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法( Hea ...

  5. Java数据结构——堆排序

    文章目录 一.堆排序 (一).什么是堆排序 (二).图例 (三).Java代码 一.堆排序 (一).什么是堆排序 知识卡片: 1. 堆排序(HeapSort). 2. 堆排序是指利用堆这种数据结构所设 ...

  6. 数据结构第16周 :( 希尔排序+ 堆排序 + 快速排序 )

    目录 希尔排序 堆排序 快速排序 希尔排序 [问题描述]给出一组数据,请用希尔排序将其按照从小到大的顺序排列好. [输入形式]原始数据,以0作为输入的结束:第二行是增量的值,都只有3个. [输出形式] ...

  7. 【浅谈数据结构】《数据结构》Data Structure

    <数据结构>60' 一.栈(stack).队列(Queue).向量(Vector) 1.链表 带哨兵节点链表了解清楚 链表要会写,会分析.各种链表. 2.栈 LIFO(last in fi ...

  8. Python中Numpy包的学习

    Numpy实现基本的矩阵运算 a*b实现矩阵叉乘,使用代码和运行结果如图 #矩阵相乘 import numpy as np a1=np.mat([[1,2,3],[4,5,6],[7,8,9]]); ...

  9. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】

    经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话   ...

最新文章

  1. zeekooper集群搭建_How to do - ZooKeeper集群搭建(我见过最详细的完整教学)
  2. Hyper-V 2016:支持guest操作系统
  3. XManager 远程连接Netbackup图形用户界面
  4. linux windows多任务,windows是多用户多任务系统吗?
  5. DevOps之发布系统
  6. Hibernate POJO在序列化(JSON)时遇到的若干问题
  7. 安卓3d游戏引擎_3D球闯关游戏-3D球闯关游戏安卓官方版预约 v1.2.5
  8. Position与localPosition的区别
  9. 图解 SpringCloud 体系!
  10. PHP7.1 狐教程
  11. ajax请求实用的封装方法
  12. 影子系统 重启蓝屏 开机蓝屏 安全模式蓝屏 进PE蓝屏 解决方案
  13. Overlay网络技术之vxvlan
  14. 微信小程序点击图片放大图片
  15. keil删除工程_安装及卸载keil5
  16. java中system.in怎么用
  17. 数据可视化 - 什么是数据可视化
  18. Beyond Compare不能打开*.te文件解决方案
  19. 幅频特性曲线matlab,幅频特性曲线的matlab模拟
  20. 有一个四分钟的沙漏,一个七分钟的沙漏,怎样测试九分钟的时间

热门文章

  1. CPU 和 GPU频率设置
  2. ios开发ocr识别_传统图像处理技术,ocr识别技术算法
  3. python数据库连接信息加密_python实现对服务器脚本敏感信息的加密解密功能
  4. Softmax和softmax loss的理解
  5. VueJS项目报错解决:router.map is not a function - 方法大全
  6. 发起ajax请求很慢,为什么我的Ajax请求比一般的浏览器请求慢得多?
  7. c语言正则表达式_CS143:编译原理|PA2:正则表达式和词法分析
  8. 龙果充值平台,具备话费充值、流量充值、话费卡兑换功能;可以拓展其他充值兑换业务;也适用于支付、鉴权等业务功能的拓展。
  9. 最新京东炸年兽活动一键做任务工具v1.4
  10. 使用常识 | 如何在word中添加勾选框