堆排序C++实现
/* * heapsort.cpp * * Created on: 2016年3月30日 * Author: Lv_Lang */ //堆排序 #include <iostream> using namespace std; /*堆排序算法解析: 核心思想在于建立最大堆(或最小堆), 因为最大堆满足一个性质:所有的父节点都要比它的左右节点均要大, 于是据此可以每次将最大的(根节点)抽取出来(实际上是放最后面), 每次都抽取剩余部分的最大值,那最终得到的序列就是有序的。 所以堆排序其实算是一种高级版的选择排序。 建立最大堆的方法:首先从底层的父节点开始,把它的子树整成最大堆, 然后往上整成最大堆,注意这里要从下往上。 最后堆排序就是先建立一个最大堆,然后把根节点元素也就是最大的元素 跟最后面的元素交换,这样一来,树就未必满足最大堆了,所以要重新 进行堆的调整(不包括已经被抽取的最大元素)。这样下来,每次都抽取 出子序列的最大元素,最终的序列就从小到大排好序了。*/ void swap(int a[],int i,int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } void HeapAdjust(int *a,int i,int size) { int left = 2*i;//左孩子节点 int right = 2*i + 1;//右孩子节点 int max = i;//暂存最大元素下标 if(left <= size && a[left] > a[max]) //这里不直接交换是因为如果交换则要进行递归, //所以连同右边的也判断了再做可能的交换和做可能的递归, //递归的原因则是因为你把人的老爸交换了, //那人家的儿子可能就比继父要大了。 //swap(a,left,i); max = left; if(right <= size && a[right] > a[max]) max = right; if(max != i)//表明当前的父节点并不是最大的 { swap(a,i,max); HeapAdjust(a,max,size);//有交换就要递归把子树也整成最大堆 } } void BuildHeap(int a[],int size) { for(int i = size / 2;i >= 1;i--)//非叶节点最大下标为/2 { HeapAdjust(a,i,size); } } //堆排序对要排序的序列有个要求就是下标是从1开始到size的,而并非常用的0~size-1 void HeapSort(int a[],int size) { BuildHeap(a,size);//先建立初始的最大堆 for(int i = size;i >= 2;i--) { swap(a,1,i);//把最大的元素放到最后面 size--;//不再包括最大的元素 //这里之所以直接从根节点开始维护堆是因为除了根节点外的其他子树都是最大堆了。 //而上面第一次建立最大堆时不能保证父节点已经是最大的了, //所以上面的需要先从底层的非叶节点层开始维护/调整堆。 HeapAdjust(a,1,size); } //至此数组就已经从小到大排好序了, //如果要从大到小输出,则倒着输出就行了; //而如果要将序列从大到小排序,则应建立最小堆。 } void print(int a[],int size) { for(int i=1;i < size;i++) cout<<a[i]<<" "; cout<<a[size]<<endl; } int main() { int a[7] = {0,4,6,1,5,3,2}; cout<<"排序之前的序列为:"<<endl; print(a,6); HeapSort(a,6); cout<<"排序之后的序列为:"<<endl; print(a,6); return 0; }
关于堆排序算法,网上有更好更详细的解析,这里放一个我觉得挺好的解析博客,因为它有图:
堆排序C++实现的更多相关文章
- 算法与数据结构(十四) 堆排序 (Swift 3.0版)
上篇博客主要讲了冒泡排序.插入排序.希尔排序以及选择排序.本篇博客就来讲一下堆排序(Heap Sort).看到堆排序这个名字我们就应该知道这种排序方式的特点,就是利用堆来讲我们的序列进行排序.&quo ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- 数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序
#!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序 重点的地方:小堆序 ...
- 堆排序(python实现)
堆排序是利用最大最或最小堆,废话不多说: 先给出几个概念: 二叉树:二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树” 完全二叉树:除最后一层外, ...
- 堆排序分析及php实现
堆排序:是一种特殊形式的选择排序,他是简单选择排序的一种改进. 什么是堆? 具有n个元素的序列:{k1,k2,ki,…,kn} (ki <= k2i,ki <= k2i+1) 或者 (ki ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
- [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)
[Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...
- PHP实现堆排序
经验 工作了,面试我工作这家公司时被技术面打击得不行,因为自己的数据结构等基础学得实在太差,虽然原来是想做设计师的说...不过看在PHP写得还凑合的份上能来实习了,但还是决心恶补一下基础. 其实自己之 ...
- 堆排序 Heapsort
Prime + Heap 简直神了 时间优化好多,顺便就把Heapsort给撸了一发 具体看图 Heapsort利用完全二叉树+大(小)顶锥的结构每次将锥定元素和锥最末尾的元素交换 同时大(小)顶锥元 ...
随机推荐
- mac下使用sencha cmd+extjs6
笔者刚接手公司一个项目,后台是使用extjs6做前端,php做api接口,两者通过ajax交互 没办法,不管接手的项目多么的挫逼,都还是要上的,拿人钱财替人消灾嘛 首先是安装sencha cmd ,百 ...
- MySQL DCL 整理
DCL(Data Control Language)数据库控制语言 授权,角色控制等GRANT 授权REVOKE 取消授权
- 利用Babel来转化你的ES2015脚本初步
我们在前面已经安装和学习过babel 安装babel-cli 这是babel解释器的客户端主程序 npm install -g babel-cli 安装”编译”插件(babel的JSX语法转换器) n ...
- SPSS数据分析—对数线性模型
我们之前讲Logistic回归模型的时候说过,分类数据在使用卡方检验的时候,当分类过多或者每个类别的水平数过多时,单元格会划分的非常细,有可能会导致大量单元格频数很小甚至为0,并且卡方检验虽然可以分析 ...
- python+selenium安装步骤
1.先安装python 2.下载setuptools 使用方法是在 命令提示符(cmd)下 输入 "easy_install包名称" 3.安装pip 4.安装selenium如果是 ...
- 关于Application.Lock和Lock(obj) 转 http://www.cnblogs.com/yeagen/archive/2012/03/01/2375610.html
关于Application.Lock和Lock(obj) Posted on 2012-03-01 15:28 billpeng 阅读(3498) 评论(3) 编辑 收藏 1.Application. ...
- nodejs 服务端添加相应头Access-Control-Allow-Origin
重点在这句:res.setHeader("Access-Control-Allow-Origin", "*"); var http = require(&quo ...
- jquery 跨域访问问题 转
http://zld406504302.iteye.com/blog/1677937 服务器,jsp <%@ page language="java" contentType ...
- Mac Mysql初始密码重置
今天晚上mac更新后重装MySQL 安装完成后 启动服务,死活登录不了 提示1045错误.按照网上的资料对MySQL密码进行重置.记录步骤如下: 1.首先关闭MySQL服务 系统偏好设置->最下 ...
- http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html(转载)(原作者:AstralWind)
Python正则表达式指南 本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优 ...