【Algorithm】堆排,C++实现
对一个数组中的元素按照顺序构建二叉树,就形成了一个(二叉)堆。(二叉树是虚拟的,并不是真的建立二叉树)
表示堆的数组A有两个重要属性:A.heapSize,表示堆里面有多少元素,数组里有多少元素在堆里
A.length,表示数组长度
例如数组A= {1,2,3,4,5,6,7,8,9,10},此时A.heapSize = A.length。除了最后一层之外,这个二叉树是完满的
最大堆:父节点的值总是不小于子节点的值,反应在数组中就是A[i]>=A[2i+1] && A[i]>=A[2i+2],如果2i+2<A.size的话
最小堆:父节点的值总是不大于子节点的值,反应在数组中就是A[i]<=A[2i+1] && A[i]<=A[2i+2],如果2i+2<A.size的话,上图就是一个最小堆
堆排一般用最大堆,输出升序数组,最小堆用于优先队列。
堆排的时间复杂度是O(nlgn)
我写的是最小堆排序,输出降序数组
- //=================== 最小堆维护 ==================
- // 调整根节点为arr[i]的子树顺序,将最小的节点放到根节点位置
- // 递归调整被置换的子节点
- void minHeapfy(vector<int> &arr, int i, int heapSize){
- int left = * i + ; //对于arr[i],它的左孩子是arr[2i+1]右孩子是arr[2i+2]
- int right = * i + ;
- int least = i;
- if (left < heapSize && arr[left] < arr[least])
- least = left;
- if (right < heapSize && arr[right] < arr[least]){
- least = right;
- }
- if (least != i){
- int temp = arr[i];
- arr[i] = arr[least];
- arr[least] = temp;
- minHeapfy(arr, least, heapSize); //如果子树发生变动,递归调整有变动的子节点
- }
- }
- //=============== 建立最小堆 ================
- // 利用minHeapfy调整每一棵子树,arr中arr[arrSize/2:]的元素都是叶子节点
- void buildMinHeap(vector<int> &arr){
- int heapSize = arr.size();
- for (int i = heapSize/-; i >= ; i--){
- minHeapfy(arr, i, heapSize);
- }
- }
- // ================ 输出堆排结果 ====================
- //由于根节点总是全堆最小的,每次置换根节点与最后一个节点
- //对被置换之前的数组进行最小堆建立
- void heapSort(vector<int> &arr){
- int heapSize = arr.size();
- buildMinHeap(arr);
- for (int i = heapSize - ; i >= ; i--){
- int temp = arr[]; //置换根节点元素和当前数组最后一个元素
- arr[] = arr[i];
- arr[i] = temp;
- heapSize -= ;
- minHeapfy(arr, , heapSize); //对有序元素之前的节点建立最小堆
- }
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- vector<int> primes = { , , , , , , , , , };
- heapSort(primes);
- for (int i = ; i < primes.size(); i++){
- cout << primes[i] << endl;
- }
- system("pause");
- return ;
- }
【Algorithm】堆排,C++实现的更多相关文章
- 数组第K小数问题 及其对于 快排和堆排 的相关优化比较
题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...
- P1177 【模板】快速排序(学完归并和堆排之后的二更)
P1177 [模板]快速排序 不用说,连题目上都标了是一道模板,那今天就来对能用到的许多排序方式进行一个总结: 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理 ...
- STL_算法_Heap算法(堆排)(精)
C++ Primer 学习中. . . 简单记录下我的学习过程 (代码为主) /***************************************** STL-算法--Heap算法 堆排序 ...
- DS 图解堆排
堆排其实就是选择排序,只不过用了完全二叉树特性. 堆排思想 : 利用完全二叉树特性建堆和重复选择调整来得到有序数组. 完全二叉树有什么特性呢? 节点左对齐 ---> 层序遍历不会出现空,可以用数 ...
- 造轮子-Java泛型堆排
个人博客地址:http://kyle.org.cn/2018/03/13/heapsort/ Java实现泛型堆排算法,用于N个对象中选择最大或者最小的前M个,其中M<=N 类似于Mysql中o ...
- 排序算法C语言实现——冒泡、快排、堆排对比
对冒泡.快排.堆排这3个算法做了验证,结果分析如下: 一.结果分析 时间消耗:快排 < 堆排 < 冒泡. 空间消耗:冒泡O(1) = 堆排O(1) < 快排O(logn)~O(n) ...
- python 快排,堆排,归并
#归并排序 def mergeSort(a,L,R) : if(L>=R) : return mid=((L+R)>>1) mergeSort ...
- java 堆排,优先级队列,归并排序
堆排 堆排是基于二叉树而得来的 例如:对一个数组 可以转为二叉树: 二叉树特性父节点为 i , 左叶子节点为2i+1:右叶子节点为2i+2; 步骤分解: 1. 先从第一个非叶子节点(即下 ...
- 堆排Heap Sort
1. #define LeftChild(i) (2*(i)+1) void PercDown(vector<int>&num, int i, int n) { int child ...
随机推荐
- BZOJ2102 : [Usaco2010 Dec]The Trough Game
暴力枚举答案然后检验. #include<cstdio> int n,m,i,j,k,a[100],b[100],cnt,ans;char s[20]; int main(){ for(s ...
- 命令模式坚决svn树冲突(local unversioned, incoming add upon update)
当工作目录修改删除过时更新使用svn更新就容易发生树冲突“Tree Confilict”.会出现类似提示. local unversioned, incoming add upon update 如果 ...
- POJ 3691 (AC自动机+状态压缩DP)
题目链接: http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...
- 十个JavaScript中易犯的小错误,你中了几枪?
序言 在今天,JavaScript已经成为了网页编辑的核心.尤其是过去的几年,互联网见证了在SPA开发.图形处理.交互等方面大量JS库的出现. 如果初次打交道,很多人会觉得js很简单.确实,对于很多有 ...
- 移动互联网终端的touch事件,touchstart, touchend, touchmove
如果我们允许用户在页面上用类似桌面浏览器鼠标手势的方式来控制WEB APP,这个页面上肯定是有很多可点击区域的,如果用户触摸到了那些可点击区域怎么办呢??诸如智能手机和平板电脑一类的移动设备通常会有一 ...
- RSA密钥的生成与配置
openssl下载地址http://dldx.csdn.net/fd.php?i=20313208579480&s=ac2e809e168f7d5b8bf1515d3d6b1aa4,或者官方下 ...
- ModelMap和ModelAndView的作用
首先介绍ModelMap和ModelAndView的作用 ModelMap ModelMap 对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即 ...
- edtftpj让Java上传FTP文件支持断点续传
在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传:或者想做类似迅雷下载类似的功能,文件太大,今天传一 ...
- php页面之间传值
echo("<script>window.open('2.php?head=".$head."');<script>");
- 序号自增key的使用
由于在模板中,需要输出序号,但是从数据库中提取的话,保证不了序号的连续性. 在模板中我就使用foreach循环,查手册看到foreach的使用 但是我还是没从手册中学会key的使用.尝试使用 结果,如 ...