首先,推荐一下《算法导论》的第六章---堆排序,在网上找了很多资料,发现还是这本圣经最给力。大家学堆排序一定要去看看,不然是一种浪费。如果大家没有,可以去网上下载英文版(chm版)的,既清晰又适合阅读。

其实堆排序的讲解网上很多,而且基本都一样,不过我还是把一些基本概念写出来:

:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全二叉树,树中每个结点与数组中存放该结点值的那个元素对应。

二叉堆有两种:最大堆和最小堆(小根堆)。

最大堆:所有节点的子节点比其自身小的堆。 最小堆:所有节点的子节点比其自身大的堆。

堆排序:堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单

在堆排序算法中,使用的是最大堆,最小堆通常在构造优先级队列时使用。

再次提醒大家,去看看《算法导论》里的第六章-堆排序。因为书上讲的太详细了,所以我也就不再多说。

这里我把《算法导论》上的伪代码用C/C++实现了,每个函数我都用自己的理解写出来了,如果大家还不懂,可以留言。

/*
* Author: Tanky Woo
* Blog:   www.WuTianQi.com
* Data:   2010.12.20
* Note:   堆排序(Heap Sort)
*/
#include
using namespace std;// 输出当前堆的排序状况
void PrintArray(int data[], int size)
{for (int i=1; i<=size; ++i)cout < a[i])largest = lt;elselargest = i;if(rt <= size && a[rt] > a[largest])largest = rt;if(largest != i){int temp = a[i];a[i] = a[largest];a[largest] = temp;MaxHeapify(a, largest, size);}
}// 建堆
// 自底而上地调用MaxHeapify来将一个数组a[1..size]变成一个最大堆
//
void BuildMaxHeap(int *a, int size)
{for(int i=size/2; i>=1; --i)MaxHeapify(a, i, size);
}// 堆排序
// 初始调用BuildMaxHeap将a[1..size]变成最大堆
// 因为数组最大元素在a[1],则可以通过将a[1]与a[size]互换达到正确位置
// 现在新的根元素破坏了最大堆的性质,所以调用MaxHeapify调整,
// 使a[1..size-1]成为最大堆,a[1]又是a[1..size-1]中的最大元素,
// 将a[1]与a[size-1]互换达到正确位置。
// 反复调用Heapify,使整个数组成从小到大排序。
// 注意: 交换只是破坏了以a[1]为根的二叉树最大堆性质,它的左右子二叉树还是具备最大堆性质。
//        这也是为何在BuildMaxHeap时需要遍历size/2到1的结点才能构成最大堆,而这里只需要堆化a[1]即可。
void HeapSort(int *a, int size)
{BuildMaxHeap(a, size);PrintArray(a, size);int len = size;for(int i=size; i>=2; --i){int temp = a[1];a[1] = a[i];a[i] = temp;len--;MaxHeapify(a, 1, len);cout << "中间过程:";PrintArray(a, size);}}int main()
{int size;int arr[100];cout << "Input the num of elements:\n";cin >> size;cout << "Input the elements:\n";for(int i=1; i<=size; ++i)cin >> arr[i];cout << endl;HeapSort(arr, size);cout << "最后结果:";PrintArray(arr, size);
}

最后,给大家推荐我在网上看到的写的不错的几篇堆排序文章:

1.http://blog.csdn.net/super_chris/archive/2009/09/22/4581900.aspx

这一篇讲得很细致。

2.http://blog.csdn.net/madeinchn/archive/2010/04/12/5473871.aspx

大家可以看看文章里的图,注意那是最小堆实现的图。

3.http://blog.csdn.net/midgard/archive/2009/04/14/4070074.aspx

同样讲的很细致的一篇。

4.http://student.zjzk.cn/courseware/datastructure/web/paixu/paixu8.4.2.2.htm

这是网站很给力,有flash模拟堆排序,大家可以实际去看看。

堆排序基础讲解(代码+注释)相关推荐

  1. Educational Codeforces Round 145 (E. Two Tanks 详细讲解 + 代码注释)

    E. Two Tanks 链接:E. Two Tanks 推荐大佬的视频讲解:B站 yingluosanqian 大晚上琢磨jiang老师的代码看不明白,还好找到这个视频讲解,以下题解基于该视频讲解, ...

  2. 机器学习-朴素贝叶斯(基础讲解+代码实现+图像展示)

    朴素贝叶斯 定理: 某晚,C准备收拾东西接女朋友,那么小C要不要带伞呢. 已知:天气预报说今日降水概率为50%–P(A) 晚高峰堵车的概率为80%–P(B) 如果下雨,晚高峰堵车的概率是95%–P(B ...

  3. 扩展欧几里得定理基础讲解 代码及证明

    知识储备 1 . 朴素欧几里得原理:gcd(a,b) == gcd(b,a % b) 2 . 负数取模:忽略符号返回绝对值就好了 3 . 模数原理:对于整数a,b必然存在整数k使得a % b == a ...

  4. 高频笔试面试刷题总结之链表(分布讲解代码注释)

    JZ22 链表中倒数最后k个结点[简单] 题面  思路 双指针,定义两个指针:first 和 second 前一个指针先走 k 步,在它走的 k 步中,若发现指针 first 置空,则返回 nullp ...

  5. C语言代码注释 - C语言零基础入门教程

    目录 方法一:使用// 方法二:使用/* */ 方法三:使用宏 #if #else #end 猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 ...

  6. Python代码注释 - Python零基础入门教程

    目录 一.什么是代码注释 二.为什么写代码要注释 三.代码注释的方式 1.单行注释,使用英文符号 # 2.多行注释 方法一:英文状态下使用单引号 """ 方法二:英文状态 ...

  7. python代码大全中文注释_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)...

    本文内容主要介绍了Python代码注释规范代码实例解析,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 一.代码注释介绍 注释就是对代码的解释和说明 ...

  8. python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)

    本文内容主要介绍了Python代码注释规范代码实例解析,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 一.代码注释介绍 注释就是对代码的解释和说明 ...

  9. (信贷风控九)行为评分卡模型python实现(详细代码+注释+讲解)

    (九)行为评分卡模型python实现(详细代码+注释+讲解) 浅谈行为评分卡 我们知道行为评分卡只要用在信贷的贷中环节,贷中指的是贷款发放之后到期之前的时间段,其实行为评分卡和申请评分卡在实现上没有太 ...

最新文章

  1. MongoDB数据库(一:基本操作)
  2. 安装了mysql5.7后,如何进行配置(密码等)初始化
  3. 使用alipaySDK编译时找不到openssl/asn1.h文件的解决办法(初探)
  4. 在阿里云 ECS 上试图安装 SAP Commerce Cloud 的 137 错误
  5. Oracle 最后通牒:要 Java 8 更新先交钱!
  6. 强化学习组队学习task06——DDPG 算法
  7. C#复习笔记(2)--C#1所搭建的核心基础
  8. 计算机作业个人简历word,计算机毕业生个人简历模板word模板
  9. 数字电路基础知识(二) 复位设计-亚稳态的产生与影响
  10. 人脸检测FDDB评测的详细步骤
  11. Windows系统为指定用户设定本地组策略
  12. 数据结构 WSADATA
  13. 图片缩放库 Photoview 和 Gif 控件 GifView 的使用
  14. 1058:求一元二次方程
  15. MATLAB梯度和拉普拉斯算子在图像边缘检测中的应用
  16. android 定时删除文件,使用安卓手机,记得定期清理这4个文件夹,可轻松释放大量空间...
  17. java数据结构课程设计_java数据结构课程设计
  18. ASP.NET + adminLTE (一)
  19. 【数理逻辑】谓词逻辑 ( 一阶谓词逻辑公式 | 示例 )
  20. 《Java从小白到大牛》第29章:项目实战1:开发PetStore宠物商店项目

热门文章

  1. 学会这招,妈妈再也不担心我的排名上不去了
  2. openstack placement
  3. linux批量管理工具之ansible
  4. 34%的出轨率是怎么算的
  5. 1万字精讲,这你还学不废?Python爬取腾讯视频《斛珠夫人》弹幕,并转换成词云(单线程)——爬虫实例2
  6. SW3518快充方案
  7. Android 实现指南针效果
  8. 腾讯广告算法大赛(即腾讯社交广告算法大赛)
  9. 追思清明 浸润童心-----宁都县幼儿园清明祭英烈主题活动
  10. 窗帘盒有哪些种类,怎样安装窗帘盒?