heap的定义:如果数组a[1,....n]满足:a[i]>a[2*i] && a[i]>a[2*i+1],1<=i<=n/2,那么就是一个heap,而且是max-heap

heap有两种,max-heap 和 min-heap,其中min-heap的性质与上面所述相反,即 a[i]<a[2*i] && a[i]<a[2*i+1].

这里以max-heap为例说明heap的三种基本操作,即Max-Heap-Maintenance, Build-Max-Heap, HeapSort.

1. Max-Heap-Maintenance

input:数组A和下标indice(i)  output:维护以 i 为根的子树的max-heap性质。

Max-Heap-Maintenance的伪代码如下

以一个例图来解释上述程序的运行过程:

a) 图为heap的初始状态,现在执行程序Max-Heap-Maintenance(A,2)。node 2的值为4,比左孩子值14小,所以把A[2] 和 A[4]进行交换,这里虽然右孩子值为7,也比A[2]要大,但我们要找两个孩子中值最大的孩子,并且将父节点和它交换。交换完毕后,从被交换的孩子节点的位置出发,图中是A[4],见图b),然后在该节点上重复上述操作,直至该节点是叶子节点,如图C),则终止程序。

2. Build-Max-Heap

因为每进行一次Max-Heap-Maintenance(i)操作,实际上都是建立以 i 为根节点的最大heap的一棵子树。所以我们自底向上建立最大heap,只有这样才能保证建立的heap具有max-heap性质。

3. Heap-Sort

首先先建立max-heap,但我们仍不能够根据max-heap得到排序结果,因为max-heap只能保证根节点值大于孩子节点的值,并没有孩子节点之间的大小关系比较。具体做法看伪代码+样例分析图。

最后贴上C++实现代码:

 1 #include<iostream>
2 #include<algorithm>
3 using namespace std;
4 int a[101];
5 int array_size,heap_size;
6 int left(int i){
7 return 2*i;
8 }
9 int right(int i){
10 return 2*i+1;
11 }
12 void Max_Heap_Maintenance(int i){
13 int l, r, largest=-1;
14 l=left(i);
15 r=right(i);
16 if(l>heap_size||r>heap_size) return;
17 if(l<=heap_size&&a[l]>a[i]){
18 largest=l;
19 }
20 else largest=i;
21 if(r<=heap_size&&a[r]>a[largest]){
22 largest=r;
23 }
24 if(largest!=i){
25 int tmp=a[largest];
26 a[largest]=a[i];
27 a[i]=tmp;
28 Max_Heap_Maintenance(largest);
29 }
30 }
31 void Build_Max_Heap(){
32 heap_size=array_size;
33 for(int i=array_size/2;i>=1;i--){
34 Max_Heap_Maintenance(i);
35 }
36 }
37 void Heap_Sort(){
38 Build_Max_Heap();
39 for(int i=array_size;i>=2;i--){
40 int tmp=a[i];
41 a[i]=a[1];
42 a[1]=tmp;
43 heap_size--;
44 Max_Heap_Maintenance(1);
45 }
46 int tmp=a[2];
47 a[2]=a[1];
48 a[1]=tmp;
49 }
50 int main(){
51 while(scanf("%d",&array_size)!=EOF){
52 for(int i=1;i<=array_size;i++){
53 scanf("%d",&a[i]);
54 }
55 Heap_Sort();
56 for(int i=1;i<=array_size;i++){
57 printf("%d ",a[i]);
58 }printf("\n");
59 }
60 return 0;
61 }

Code-HeapSort

算法导论学习-heapsort的更多相关文章

  1. 算法导论学习---红黑树具体解释之插入(C语言实现)

    前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜 ...

  2. 算法导论学习-Dynamic Programming

    转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------- ...

  3. 算法导论学习-prim算法

    一. 关于最小生成树 对于无向连通图G=(V,E),其中V表示图的顶点,E表示图的边,对于每条边都有一个权值,可以理解为边a->b的权值C为从a走到b要走的路程为C.现在我们希望找到一个无回路的 ...

  4. 算法导论学习-RED-BLACK TREE

    1. 红黑树(RED-BLACK TREE)引言: ------------------------------------- 红黑树(RBT)可以说是binary-search tree的非严格的平 ...

  5. 算法导论学习-binary search tree

    1. 概念: Binary-search tree(BST)是一颗二叉树,每个树上的节点都有<=1个父亲节点,ROOT节点没有父亲节点.同时每个树上的节点都有[0,2]个孩子节点(left ch ...

  6. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...

  7. 算法导论学习笔记1---排序算法(平台:gcc 4.6.7)

    平台:Ubuntu 12.04/gcc 4.6.7 插入排序 #include<vector> #include <algorithm> #include<iostrea ...

  8. [置顶] 《算法导论》习题解答搬运&&学习笔记 索引目录

    开始学习<算法导论>了,虽然是本大部头,可能很难一下子看完,我还是会慢慢地研究的. 课后的习题和思考有些是很有挑战性的题目,我等蒻菜很难独立解决. 然后发现了Google上有挺全的algo ...

  9. 《算法导论》学习总结 — XX.第23章 最小生成树

    一.什么叫最小生成树 一个无向连通图G=(V,E),最小生成树就是联结所有顶点的边的权值和最小时的子图T,此时T无回路且连接所有的顶点,所以它必须是棵树. 二.为什么要研究最小生成树问题 <算法 ...

随机推荐

  1. windows下常用快捷键

    windows下常用快捷键: 显示桌面: win徽标+D 打开资源管理器: win徽标+E 打开任务管理器: Ctrl+Alt+delete 任务切换: Alt+Tab 应用程序中窗口之间的切换: C ...

  2. 【配置文件节点】java世界配置文件节点

    Spring <context:property-placeholder/> 期望:能不能有一种解决方案可以方便我们在一个阶段内不需要频繁书写一个参数的值,而在不同阶段间又可以方便的切换参 ...

  3. canvas 乒乓球

    <!DOCTYPE html> <html> <head> <title>Bouncing Ball With inputs</title> ...

  4. Objective-c开发中混合使用ARC

    首选“Compile Sources”的位置: 选中工程->TARGETS->相应的target然后选中右侧的“Build Phases”,向下就找到“Compile Sources”了. ...

  5. Python属性、方法和类管理系列之----元类

    元类的介绍 请看位于下面网址的一篇文章,写的相当好. http://blog.jobbole.com/21351/ 实例补充 class Meta(type): def __new__(meta, c ...

  6. C++的构造函数和析构函数

    1.构造函数和析构函数为什么没有返回值? 构造函数和析构函数是两个非常特殊的函数:它们没有返回值.这与返回值为void的函数显然不同,后者虽然也不返回任何值,但还可以让它做点别的事情,而构造函数和析构 ...

  7. BZOJ 4004 [JLOI 2015] 装备购买 解题报告

    哎这个题 WA 了无数遍...果然人太弱... 首先我们把这些装备按照花费从小到大排序,然后依次考虑是否能买这个装备. 至于这样为什么是对的,好像有一个叫拟阵的东西可以证明,然而我不会.TATQAQ ...

  8. 分布式系统之CAP理论

    任老师第一节主要讲了分布式系统实现时候面临的八个问题,布置的作业就是这个,查询CAP理论. 笔者初次接触分布式,所以本文主要是一个汇总. 一.CAP起源 CAP原本是一个猜想,2000年PODC大会的 ...

  9. TC SRM 607 DIV2

    求拼接完成后的字符串包含的子回文串的数目,一开始还用暴力去做,想都不用想 肯定超时了. 复习了一下求最长子回文串的算法,发现可以类似解决. 给相邻字符之间添加一个'@'字符,这样所有的回文串都是奇数长 ...

  10. Android网络请求心路历程

    HTTP请求&响应 既然说从入门级开始就说说Http请求包的结构.一次请求就是向目标服务器发送一串文本.什么样的文本?有下面结构的文本.HTTP请求包结构 例子: 1 2 3 4 5 6 7 ...