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. nls_sort和nlssort 排序功能介绍

    nls_sort和nlssort 排序功能介绍 博客分类: oracle   ALTER SESSION SET NLS_SORT=''; 排序影响整个会话 Oracle9i之前,中文是按照二进制编码 ...

  2. 上传图片+浏览+裁切 Demo(无后台处理部分)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. iis认证方式

    http://msdn.microsoft.com/en-us/library/aa302377.aspx

  4. ubuntu - sudo in php exec

    最近写防火墙的WEB版,需要在PHP中调用linux系统命令,但是防火墙有关的执行都需要管理员权限才能执行. 在ubuntu下,Apache2的运行账户默认是www-data,默认是不能通过sudo来 ...

  5. SQL 返回数量一定的行

    1. 限制返回的行 select top 10 * from tablename 2. 返回随机n行 select top n * from tablename order by newid()

  6. js 转化类似这样的时间( /Date(1389060261000)/)问题

    首先在你的js文件里添加这段代码: /** * 日期时间格式化方法, * 可以格式化年.月.日.时.分.秒.周 **/ Date.prototype.Format = function (format ...

  7. 取得inputStream的长度

    1.网络下载文件 URL url = new URL(strUrl); HttpURLConnection httpconn = (HttpURLConnection)url.openConnecti ...

  8. 《深入理解javascript原型和闭包系列》 知识点整理

    深入理解javascript原型和闭包系列 对原型和闭包等相关知识的讲解,由浅入深,通俗易懂,每个字都值得细细研究. 一.一切都是对象 1. typeof操作符输出6种类型:string boolea ...

  9. 2D多边形碰撞器优化器

    http://www.unity蛮牛.com/thread-19827-1-1.html http://pan.baidu.com/s/1qW2mWS8 Asset Store Link: http: ...

  10. POJ2220+DFS

    题意:给出n个宝物,m个寻宝人. 每个寻宝人对n个宝物都有一个估价. 从这些估价中挑出某些,是的价值差最小. dfs..没什么好说的,暴力枚举! /* 搜索+枚举 */ #include<std ...