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++的更多相关文章

  1. 算法与数据结构(十四) 堆排序 (Swift 3.0版)

    上篇博客主要讲了冒泡排序.插入排序.希尔排序以及选择排序.本篇博客就来讲一下堆排序(Heap Sort).看到堆排序这个名字我们就应该知道这种排序方式的特点,就是利用堆来讲我们的序列进行排序.&quo ...

  2. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...

  3. 堆排序与优先队列——算法导论(7)

    1. 预备知识 (1) 基本概念     如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...

  4. 数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序

    #!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序 重点的地方:小堆序 ...

  5. 堆排序(python实现)

    堆排序是利用最大最或最小堆,废话不多说: 先给出几个概念: 二叉树:二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树” 完全二叉树:除最后一层外, ...

  6. 堆排序分析及php实现

    堆排序:是一种特殊形式的选择排序,他是简单选择排序的一种改进. 什么是堆? 具有n个元素的序列:{k1,k2,ki,…,kn} (ki <= k2i,ki <= k2i+1) 或者 (ki ...

  7. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  8. [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)

    [Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...

  9. PHP实现堆排序

    经验 工作了,面试我工作这家公司时被技术面打击得不行,因为自己的数据结构等基础学得实在太差,虽然原来是想做设计师的说...不过看在PHP写得还凑合的份上能来实习了,但还是决心恶补一下基础. 其实自己之 ...

  10. 堆排序 Heapsort

    Prime + Heap 简直神了 时间优化好多,顺便就把Heapsort给撸了一发 具体看图 Heapsort利用完全二叉树+大(小)顶锥的结构每次将锥定元素和锥最末尾的元素交换 同时大(小)顶锥元 ...

随机推荐

  1. linux下Memcached安装以及PHP的调用

    一:安装libevent 由于memcached安装时,需要使用libevent类库,所以先安装libevent 1.官网下载:http://libevent.org/ #wget   https:/ ...

  2. iBatis调用存储过程以及MySQL创建存储过程

    首先是MySQL中创建存储过程的SQL -- 列出全部的存储过程 SHOW PROCEDURE STATUS; -- 查看一个已存在的存储过程的创建语句,假设此存储过程不存在,会提示SQL错误(130 ...

  3. 【M19】了解临时对象的来源

    1.首先,确认什么是临时对象.在swap方法中,建立一个对象temp,程序员往往把temp称为临时对象.实际上,temp是个局部对象.C++中所谓的临时对象是不可见的,产生一个non-heap对象,并 ...

  4. USB移动硬盘WinPE启动盘的制作方法

    USB移动硬盘WinPE启动盘的制作方法 软件:老九WinPE 老毛桃终于撒手无论版 发行时间:2007年9月11日 制作发行:老毛桃 作用:当系统坏了,无法进入时,用来做系统维护,备份文件.轻巧稳定 ...

  5. 一个 Android 任务队列的实现

    最近在做Android项目时遇到这样一个问题:客户端向服务器请求数据,而在网络信号太差的情况下,数据迟迟不到,甚至丢失.服务器为了解决这个问题做了频繁的重发,android 客户端就会收到很多不想要的 ...

  6. Google maps API开发(一)(转)

    一.加载Google maps API <script type="text/javascript" src="http://ditu.google.com/map ...

  7. [Effective C++ --023]宁以non-member、non-friend替换member函数

    作者在这一节中花了大幅度的篇幅来介绍为什么最好使用non-member.non-friend函数. 思路如下: 场景:如果有一个class用来表示网页浏览器,那么清楚缓存及历史记录的时候,我们可能定义 ...

  8. Linux中的终端、控制台、tty、pty等概念

    参考:http://news.newhua.com/news1/program_language/2010/623/10623141048745773199BCF0CFH6AKB9930IGCFKHB ...

  9. PAT 1015

    1015. Reversible Primes (20) A reversible prime in any number system is a prime whose "reverse& ...

  10. C#_Queue实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Queu ...