#include<iostream>
#include<vector>using namespace std;
//i代表当前节点,n代表总的数量,这里是在不断的交换
//这里最终建立的是小根堆,最小值往上冒
void change_smallest(vector<int> &nums,int len,int i)
{int smallest = i;int left = 2 * i + 1;//注意这里的序号是从0开始的int right = 2 * i + 2;if (left<len&&nums[left] < nums[smallest])smallest = left;if (right<len&&nums[right] < nums[smallest])smallest = right;if (smallest != i){swap(nums[smallest], nums[i]);i = smallest;change_smallest(nums, len,i);//采用递归的形式依次进行排序}
}void heap_sort(vector<int> &nums)
{int len = nums.size();for (int i = len / 2 - 1; i >= 0; i--){change_smallest(nums,len, i);}for (int i = len - 1; i >= 0; i--){swap(nums[i], nums[0]);//这一步是完成根顶元素和最末端的元素的交换,交换完之后,继续进行堆排序,使数组最后面的值都是当前最小值change_smallest(nums, i,0);//这里其实是把最小值和最后一位进行交换,并且不考虑交换后的元素,此时整体数组长度减一}
}void printarray(vector<int> arr, int n)
{for (int i = n - 1; i >= 0; i--)cout << arr[i] << " ";//倒序输出,因为此时的数组是递减的cout << endl;
}//按照小根堆排序
//按照最小排序
int main()
{vector<int> arr = { 3,5,4,7,6,9,8};int n = arr.size();cout << "origin array:";printarray(arr, n);heap_sort(arr);cout << "sorted array:";printarray(arr, n);system("pause");return 0;
}

堆排序(C++实现,非常简洁明了)相关推荐

  1. d-ary heaps 多叉树堆排序C++实现

    之前实现了堆排序,那是构造二叉树来实现堆排序的,但是其实二叉树还可以用大于等于二叉树来实现的,就是例如3叉树每个节点有三个孩子,4叉树,每个节点有四个孩子,等等. 这个是算法导论的一道Problem, ...

  2. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  3. 排序算法 - 堆排序

    堆排序是指利用堆这种数据结构所设计的一种排序算法. 类型:选择排序 时间复杂度(最坏):O(nlogn) 时间复杂度(最好):O(nlogn) 时间复杂度(平均):O(nlogn) 空间复杂度:O(1 ...

  4. 白话经典算法系列之七 堆与堆排序

     堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先解说下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是全然二叉树或者是近似全然二叉树. 二叉堆满 ...

  5. MYSQL实现ORDER BY LIMIT的方法以及优先队列(堆排序)

    一.MYSQL中的LIMIT和ORACLE中的分页 在MYSQL官方文档中描述limit是在结果集中返回你需要的数据,它可以尽快的返回需要的行而不用管剩下的行, 在ORACLE中也有相关的语法比如 1 ...

  6. 插入排序,希尔排序,堆排序

    本文将介绍三种排序算法--插入排序,希尔排序,堆排序.本文所有例子都是使用升序 一.插入排序 算法思想 维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较. eg: 有序 ...

  7. (C++)堆排序的3个关键函数

    堆排序:指使用堆结构对一个序列进行排序.所以,首先要有一个堆结构. 此处讨论递增排序.以及用最大堆. 注意:让存放堆的数组作为全局变量,n为元素个数,数组存放元素从下标1开始,n结束. int hea ...

  8. 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  9. 排序算法总结之堆排序

    一,堆排序介绍 堆是一个优先级队列,对于大顶堆而言,堆顶元素的权值最大.将 待排序的数组 建堆,然后不断地删除堆顶元素,就实现了排序.关于堆,参考:数据结构--堆的实现之深入分析 下面的堆排序算法将数 ...

  10. Python最大堆排序实现方法

    Python最大堆排序实现方法,具体代码如下:   # -*- coding: utf-8 -*-   def merge_sort(seq, cmp=cmp, sentinel=None):     ...

最新文章

  1. 测试人员如何赢得开发人员的尊重
  2. 整理一点关于Lucene的学习资料, 方便自己与别人查看
  3. Java中为什么需要反射?反射要解决什么问题?
  4. 微信小程序:开发之前要知道的三件事
  5. Oracle Enterprise Linux
  6. zeroclipboard浏览器复制插件使用记录
  7. pptx模块的图片框
  8. 信号处理:单边、双边频谱间的相互转换(转)
  9. C语言socket发送json,C++实现Socket传输json封装的Mat
  10. linux 查看最近用户,Linux下查看用户列表
  11. flink检查点简单理解
  12. 2005毕业生薪酬预测女超男
  13. Easyui的numberbox无法输入以0开头的数字编号(转载)
  14. Cookie、Session的使用及区别
  15. 算法注册机编写扫盲之续篇--第一课
  16. 库克说他在上大学时学会了编程,你呢?
  17. 移动应用/APP的测试流程及方法
  18. Jetpack Compose - Switch
  19. Mac 鼠标卡顿现象
  20. 02前端学习之CSS3(1)

热门文章

  1. linux NFS 配置步骤
  2. SourceAnalysis/Binder源码分析.md
  3. [Wireshark]_002_玩转数据包
  4. linux kernel menuconfig【转载】
  5. C#对象的浅拷与深拷贝
  6. C语言随机读写数据文件(二)
  7. C# 获取Newtonsoft.Json的JObject多层节点内容
  8. JUC并发编程超详细详解篇
  9. 带你了解HTTP协议(一)
  10. 07. Declare destructors virtual in polymorphic base classes