堆排序 C++
1 堆排序拥有插入排序的优点 (是一种原地排序算法只需要存储常数个元素在输入数组以外 即省空间),
同时拥有合并排序算法的复杂度 nlgn,逼格有点高
2 堆数据结构 是一个数组对象,可以被视为一颗完全二叉树,树中的每个结点的值 与 数组中存放的值 对应(看图)
完全二叉树,树中每一层都是满的,除最后一层,即叶子结点只可能存在于(假如深度为n) 最后一层n和n-1 层,且最后一层严格按照最左边的子树开始填)
a 左边为一颗完全二叉树,右边为一个数组
b 圆圈中的数字表示树中每个结点存储的值
c 结点上方的数字 表示对应的数组下标
d 数组上下连线表示父子关系,且父结点总在子结点的左边
f 当前树的高度为3 ,存储值为8的 4号结点的高度为 1 (注:此处高度 从底层最下面开始计算)
3 二叉堆有两种 最大堆 和 最小堆
最大堆特性:某个结点的值 至多跟父节点一样大 即子节点的值 <= 父节点的值
最小堆特性:与上述相反 父节点的值 <= 即子节点的值
4 一颗完全二叉树有n个结点 (n个元素),则有 [(n/2 + 1) .. n] 中的元素都是树中的叶子 (此书练习6.1-7)
//保持最大堆性质 参数inode为内部结点 注意结点从1开始,数组从0开始
void MaxHeapify(int array[], int size, int inode)
{
int largest= inode; //父结点
int left = inode*; //左子结点
int right = inode*+; //右子结点 if (left <= size && array[left-] > array[largest-])
{
largest = left;
}
if (right <= size && array[right-] > array[largest-])
{
largest = right;
} if (largest != inode) //父结点小于 左子结点 或者 右子结点
{
int temp = array[inode-]; //子结点值与父结点值交换
array[inode-] = array[largest-];
array[largest-] = temp; MaxHeapify(array, size, largest); //再次验证被交换的值的子结点是否满足 最大堆性质
}
}
//建立最大堆 使每一个父结点大于子结点 并且根结点为最大值
void BuildMaxHeap(int array[],int size)
{
for(int i=size/; i>; --i) //最多有 size/2 个内部结点
{
MaxHeapify(array, size, i);
}
}
//堆排序
void HeapSort(int array[], int size)
{
BuildMaxHeap(array, size); //建立最大堆 最大值为根结点
int temp = ;
int heapSize = size;
for (int i=size; i>; --i)
{
temp=array[]; //交换 根结点的值 与 最后面末尾的结点的值
array[]=array[i-]; //此时违背了最大堆的性质
array[i-] = temp; --heapSize; //保持最大堆的性质之前 先去掉已排好序的元素,即减小堆的大小
MaxHeapify(array, heapSize, );
}
};
void main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); int Array[] = {, , , , , , , , , }; HeapSort(Array, ); for (int i=; i<; ++i)
{
cout << Array[i] << endl;
} system("pause");
}
(转载请注明作者和出处^_* Seven++ http://www.cnblogs.com/sevenPP/ )
堆排序 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利用完全二叉树+大(小)顶锥的结构每次将锥定元素和锥最末尾的元素交换 同时大(小)顶锥元 ...
随机推荐
- 编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E。要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public void speak() 方法,在speak方法中输出“咿咿呀呀......”的信息。 (2)People类是Monkey类的子类,在People类中重写方法speak(),在speak方法 中输出“小样的,不
package homework1; public class Monkey { //构造方法 Monkey(String s) { } //成员方法 public void speak() { Sy ...
- NSArrary和NSString间的转换
将string字符串转换为array数组 NSArray *array = [Str componentsSeparatedByString:@","]; // 注意:NSArr ...
- lunix机器的jdk安装
本来不想写这篇博客的,写在这儿只是作为自己的笔记,jdk安装了千万编,但是踩过的坑老是不记,看别人的博客又各种不爽,所有索性自己写一个得了.老规矩,无图. Oracle版本的jdk下载地址:http: ...
- cocos2d-x 将cocosbuilder输出文件映射成对象的原理
转自:http://www.cnblogs.com/fox7nights/archive/2013/02/21/2920640.html 一.调用代码 CCNode* GameOverScene::l ...
- libpq程序例子
程序: [root@lex tst]# cat testlibpq.c /* * testlibpq.c * Test the C version of LIBPQ, the POSTGRES fro ...
- iOS——UIButton响应传参数
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; 方法是 ...
- C++ 过载,重写,隐藏
1.过载:在一个类中(也就是一个作用域),方法名相同,形参表不同的方法. 2.重写:父类方法使用virtual,子类方法和方法的方法名,形参表,返回类型相同,子类可以不使用virtual,但是建议使用 ...
- C#-获取datatable指定列的数据
DataTable dt = new DataTable(); da.Fill(dt); this.text ...
- [React Fundamentals] Component Lifecycle - Mounting Usage
The previous lesson introduced the React component lifecycle mounting and unmounting. In this lesson ...
- mac中vmware tools进行磁盘压缩和vmware-tools-cli的使用方法
前言: 高高兴兴的在vmware9.0中安装了mac10.8系统,然后学习iphone开发,但是发现下载的pdf都是基于xcode3.2.5的,又在10.8上面安装3.2.5,出现“五国”无法解决,最 ...