堆排序C++实现
//heap sort
//堆排序能够分为两个过程。其一是建堆。其二是出堆 //堆是一种全然二叉树,所以它能够用数组进行存储。
//堆可分为最大堆和最小堆。最大堆指任一节点的值都大于其左右孩子节点的值,最小堆自不必说。 //STL中有一套完整的堆排序算法,其相关函数包含make_heap\push_heap\pop_heap\sort-heap
//四个函数都是接受一对迭代器作为參数。其作用分别例如以下:
//push_heap是将新值放入到最后一个迭代器的位置后,进行堆调整;
//pop_heap是将当前堆的最大值放到最后一个迭代器位置,然后进行堆调整;
//make_heap是建堆过程
//sort_heap是堆排序过程
//堆排序须要对迭代器进行大小比較及相减等工作,所以两个迭代器必须是随机存取迭代器;
//priority_queue即是以堆排序为基础的配接器容器。其底层默认以vector实现 #include<vector>
#include<iostream> using namespace std; template<class type>
void heapAdjust(vector<type>& vec,int index,int length)
{//堆排序的核心算法:堆调整
int i=index;
int j=2*i; for(;j<=length;j=j*2)
{
if(j+1<=length && vec[j]<vec[j+1])
j++;//使j指向较大值
if(vec[i]>vec[j])
break;
else
{//使较大值上浮
type tmp=vec[i];
vec[i]=vec[j];
vec[j]=tmp;
i=j;
}
}
} template<class type>
void heapSort(vector<type>& vec)
{
int length=vec.size();
for(int i=(length-1)>>1;i>=1;--i)
{//建堆的过程是一个上浮的过程,从底层逐层上浮
heapAdjust(vec,i,length-1);
} for(int i=length-1;i>1;--i)
{//出堆过程是一个下沉的过程,从堆底一直沉究竟部
type tmp=vec[1];
vec[1]=vec[i];
vec[i]=tmp;
heapAdjust(vec,1,i-1);
}
} int main()
{
int a[11]={0,1,4,8,5,9,6,3,0,2,7};
vector<int> vec(a,a+11); heapSort(vec); for(int i=1;i<vec.size();++i)
{
cout<<vec[i]<<" ";
}
cout<<endl; 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利用完全二叉树+大(小)顶锥的结构每次将锥定元素和锥最末尾的元素交换 同时大(小)顶锥元 ...
随机推荐
- CAS机制(多线程)
---- 什么是CAS机制 CAS机制主要是发生于Java中原子操作类(JUC)的底层实现中,其中在CAS机制中包含3个基本参数:内存地址V.旧预期值A.要修改的新值B. 当要更新一个变量的时候,只有 ...
- 1.INFORMATION_SCHEMA简介
1. INFORMATION_SCHEMA简介 INFORMATION_SCHEMA提供对数据库元数据的访问,有关MySQL服务器信息,例如数据库或表的名称,列的数据类型或访问权限. INFORMAT ...
- memcached 经典问题或现象
缓存雪崩现象及真实案例 缓存雪崩一般是由某个缓存节点失效,导致其他节点的缓存命中率下降, 缓存中缺失的数据 去数据库查询.短时间内,造成数据库服务器崩溃. 重启 DB,短期又被压跨,但缓存数据也多一些 ...
- php S3
转载自:http://www.cnblogs.com/wangxusummer/p/6398772.html <?php /* * To change this license header, ...
- 数据结构( Pyhon 语言描述 ) — — 第4章:数据和链表结构
数据结构是表示一个集合中包含的数据的一个对象 数组数据结构 数组是一个数据结构 支持按照位置对某一项的随机访问,且这种访问的时间是常数 在创建数组时,给定了用于存储数据的位置的一个数目,并且数组的长度 ...
- Java学习之跳转语句
Java语言中提供3中跳转语句,分别是break语句.continue语句和return语句. break语句 可以用在switch语句中.在switch语句中,break语句用于中止下面的case语 ...
- Leetcode 283.移动零
移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组 ...
- Java日志实战及解析 - 引导
日志是什么? 程序日志的作用 记录程序运行情况,程序员观察和调试使用 统计分析 日后审计 程序员,开发工程师,架构师等天天打交道. 实际中有4%的代码是日志! http://logging.apach ...
- asp.net mvc数据验证
文章:asp.net mvc3 的数据验证(一) 文章:ASP.NET MVC下的四种验证编程方式 这个讲了在一个地方展示验证信息 文章:[ASP.NET MVC系列]浅谈数据注解和验证 这个在每个输 ...
- PTA 01-复杂度2 Maximum Subsequence Sum (25分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/663 5-1 Maximum Subsequence Sum (25分) Given ...