算法导论第六章之最大、最小堆

原创 2017年04月08日 00:24:53

堆是很重要的一种数据结构,常常用在排序和优先队列的实现上,当然在C++ STL中有优先队列的实现,但是者并不妨碍我们去学习他。

堆其实是一种数组对象,也就是说他的数据全部都存储在数组中,它可以被视为一棵完全二叉树(不懂二叉树的请自行百度)。(二叉堆)堆有两种:最大堆和最小堆。

最大堆
通俗来讲,满足下面要求的完全二叉树为最大堆:
除了根节点以外的每一个节点i,有:
A[Parent]>=A[i]
注:数组A[]是存储堆元素的数组。
这样堆中的最大值明显是存储在根节点中的(如果有和根节点同样大的值,其子节点也会存储最大的数据)。

最小堆:
最小堆和最大堆有点相反的意思,其满足的条件是在完全二叉树中,除了根节点以外的节点i,有:
A[Parent]<=a[i]

主要的运用的基本过程:
下面以最大堆来描述各个过程和实现

MAX-HEAPIFY()过程:
保持最大堆的性质,那么我们假设某个节点i,他的左子树LEFT(i)和右子数都是最大堆,那么节点i对于他的两棵子树来说可能会小于子数节点,这时候就需要对堆进行调整。运行时间O(lgn);

实现代码:
**

//这里和书上不太一样,因为他的伪代码直接有heapSize
MAX—HEAPIFY(a,int i,int heapSize){
int largest;
int change;
int l = a[i/2];
int r = a[i/2+1];
if(l<=heapSize&&a[l]>a[i])
    largest = l;
if(r<=heapSize&&a[r]>a[l])
    largest = r;
if(largest!=i){
    change = a[i];
    a[i] = a[largest];
    a[largest] = change;
    MAX-HEAPFIPY(A,largest,heapSize);
}
}
注:只有节点i和其子节点有过交换才会继续判断,否则就是满足最大堆的要求的。

BUILD-MAX-HEAP()过程:
对于一个存储数组(存储着堆 的节点的值),我们知道1…..n个节点的时候从n/2+1到n是叶子节点,那么一个叶子节点肯定是一个堆,所以我们对堆进行处理一般是对非叶子结点进行处理。代码如下:

BUILD—MAX-HEAP(A,int heapSize){
    for(int i = heapSize/2+1;i<n;i++)
         MAX-HEAPIFY(A,i,heapSize);
}

HEAPSORT()过程:
HEAP()就是堆排序过程,首先将给定的数据排列成一个最大,最小堆(这里以最大堆为例),然后在对堆进行排序:

HEAPSORT(A,int heapSize){
   BUILD—MAX-HEAP(A,heapsize);
    int leap;
    for(int i = heapSsize-1;i>0;i--){
        leap = a[0];
        a[0] = a[i];
        a[i] = leap;
        heapSize -= 1;
        BUILD-MAX-HEAP(A,a[0],heapSize);  
     }
  }

最小堆的运用实现:

最小堆其实很像最大堆的一个相反的过程。

MIN-HEAPIFY()过程:

MIN—HEAPIFY(a,int i,int heapSize){
int smallest;
int change;
int l = a[i/2];
int r = a[i/2+1];
if(l<=heapSize&&a[l]<a[i])
    largest = l;
if(r<=heapSize&&a[r]<a[l])
    smallest = r;
if(smallest!=i){
    change = a[i];
    a[i] = a[smallest];
    a[smallest] = change;
    MAX-HEAPFIPY(A,smallest,heapSize);
}
}

BUILD—MIN-HEAP过程

BUILD—MIN-HEAP(A,int heapSize){
    for(int i = heapSize/2+1;i<n;i++)
         MIn-HEAPIFY(A,i,heapSize);
}

HEAPSORT()过程

HEAPSORT(A,int heapSize){
    BUILD—MIN-HEAP(A,heapsize);
    int b[N];  ///因为我们的a[0]就是最小,如果想要填补我们有另外一个                                          // 数组            
    int leap;
    int k = 0;
    for(int i = heapSsize-1;i>0;i--){
        b[k++] = a[0];
        a[0] = a[i];
        heapSize -= 1;
        BUILD-MIN-HEAP(A,a[0],heapSize);  
     }
     b[k++] = a[0];
     for(int i=0;i<k;i++)
        a[i] = b[i];
  }

堆排序(最小堆)--【算法导论】

堆排序的思想在堆排序(最大堆)已做说明,故不再赘述; 总之,思想就是首先进行建堆,由于这是最小堆,故而必须保证父节点都小于孩子节点,若不满足条件,则进行调节; 最后进行堆排序,不断将最小的提取出来...
  • xjm199
  • xjm199
  • 2014年01月08日 21:39
  • 4495

算法导论-6.5-9 使用最小堆完成k路归并算法

//基于最小堆的K路归并算法 #include #include #include using namespace std; typedef struct node{ int value; ...
  • shakingWaves
  • shakingWaves
  • 2014年01月05日 15:05
  • 1266

算法导论第六章6.5优先队列课后答案。

6.5-1 试说明HEAP-EXTRACT-MAX在堆A={15,13,9,5,12,8,7,4,0,6,2,1}上的操作过程。 HEAP-EXTRACT-MAX(A) if(A.heap-size...
  • z84616995z
  • z84616995z
  • 2014年01月05日 19:30
  • 2533

“用最小堆将k个已排序链表合并为一个排序链表”(算法导论 练习6.5-9)

问题:请给出一个时间为O(nlgk),用来将k个已排序链表合并为一个排序链表的算法。此处的n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并) 编程思路: 假设k个链表都是非降...
  • zhengzhon
  • zhengzhon
  • 2014年06月08日 17:20
  • 713

算法导论—最小堆

#include #include class UnderflowException { }; using namespace std; template class minHeap { p...
  • kesonyk
  • kesonyk
  • 2015年04月09日 15:03
  • 259

算法导论第三版习题6.5

6.5-1(a) 首先直接提取max=A[1]=15max = A[1] = 15; (b) 然后令A[1]=A[heap_size]=1A[1]=A[heap\_size]=1,让heap_siz...
  • obguy
  • obguy
  • 2016年02月28日 14:08
  • 1052

算法导论第六章6.1堆课后答案

6.1-1在高度为h的堆中,元素个数最多和最少分别是多少? 最少是最底层只有一个叶子结点:2^0+2^1+...+2^(h-1)+1=2^h 最多是这个堆(包括最底层)是一个完全二叉树:2^0+2...
  • z84616995z
  • z84616995z
  • 2014年01月01日 19:49
  • 4145

算法导论12.1什么是二叉搜索树 练习总结

12.1-1 对于关键字集合 { 1,4,5,10,16,17,21 },分别画出高度为2、3、4、5 和 6 的二叉搜索树。 ANSWER: 12.1-2 二叉搜索树性质与最小堆性质(见 6.1...
  • chan15
  • chan15
  • 2015年09月25日 18:33
  • 832

算法导论6.5-8堆排序-K路合并

一、题目 请给出一个时间为O(nlgk)、用来将k个已排序链表合成一个排序链表算法。此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并) 二、步骤 step1:取每个链表的第一个元...
  • mishifangxiangdefeng
  • mishifangxiangdefeng
  • 2012年06月16日 10:39
  • 7999

算法导论第六章6.4

6.4-1  注意要先建最大堆,每次交换后要保持最大堆的性质。 6.4-2  先说说什么是循环不变量,所谓循环不变量就是在某个循环过程维持某个性质不变。(比如求最大值,最大堆,最小堆,最小值,这个性...
  • u010969626
  • u010969626
  • 2016年06月24日 23:35
  • 471
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论第六章之最大、最小堆
举报原因:
原因补充:

(最多只允许输入30个字)