`
tangyuan1314
  • 浏览: 39101 次
  • 性别: Icon_minigender_2
  • 来自: 南京
社区版块
存档分类
最新评论

数据结构----堆(1)

阅读更多

1、堆及性质

堆,或者叫二叉堆,可以被视为一棵完全二叉树。树中每个节点与数组中存放该节点值的那个元素相对应。树的每一层都是填满的,除了最后一层。节点在堆中的高度定义为从本节点到叶子节点的最长简单下降路径上边的数目,而堆的高度就是树根的高度。因此,在高度为h的堆中,共有h+1层,最多有2^(h+1)-1个元素,最少有2^h个元素。而n个元素的堆的高度为log2n最小值。

2、分类

二叉堆分为两种:最大堆和最小堆(小根堆)。最大堆(最小堆)指每个节点的值都比其两个子节点的值要大或等于(小或者等于)。

最大堆用于堆排序中,最小堆通常用于构造优先队列时用。

3、建堆子程序

首先,介绍最大堆操作的一个重要子程序Max_Heapify(A,i),输入是一个数组A和下标i,此程序将以i为根的子树成为最大堆,但前提是i为根的两个子树都已经是最大堆。其将A[i]在最大堆中下降,知道找到合适的位置满足以i为根的子树成为最大堆。

程序如下:void max_heapify(int A[],int len,int i){

   int l=2*(i+1)-1;//左孩子下标
   int r=2*(i+1);//右孩子下标
   int largest=i;//初始化时,将largest设为i,否则到达叶子时由于初始不等于i会出现死循环一直递归
   int temp=0;
   if(l<len&&A[l]>A[i]){//1
       largest=l;
   }
   if(r<len&&A[r]>A[largest]){//2,这两处小于号是求最小堆,大于号是最大堆
       largest=r;
   }

   if(i!=largest){
      temp=A[i];
	  A[i]=A[largest];
	  A[largest]=temp;
	  max_heapify(A,len,largest);
   }
}

程序是个递归的过程,首先找到节点i和两个子节点这三个节点中值最大的下标存入largest,如果最大的就是A[i],以i为根的子树已经是最大堆,程序结束。否则,将A[largest]和A[i]互换,交换后,下标为largest的节点的值是A[i],此时再往下降,调用此时的以largest为根节点的递归程序。

Max_Heapify用于一个高度为h的节点所需的运行时间为O(h).

4、建堆

自底向上的用Max_Heapify来将数组A[0,...,n-1]变成最大堆,由于A[n/2+1,....,n-1]都是叶子节点,没有子节点,因此不需要执行。所以只需从n/2自底向上到0,调用Max_Heapify。

为什么自底向上?因为Max_Heapify的前提是左右两个子树必须是最大堆,因此,自底向上,保证这个前提条件。下面是建堆程序:

 

int main(){
	int A[10]={16,4,10,14,7,9,3,2,8,1};
        int len=10;
	for(int i=len/2;i>=0;i--){//建最大堆或者最小堆
	   max_heapify(A,len,i);//min_heapify(A,len,i)
	}

	return 0;
}

 

 

分析建堆算法,Max_Heapify运行时间O(log2n),共有O(n)次调用,故运行时间O(nlog2n)。更精确的,根据二叉树的性质,在任意高度h上,至多有n/2^(h+1)(取最大值)个节点。一个n元素堆的高度为log2n,因此,可算得运行时间为

O(n),即在线性时间里,可以完成最大堆(最小堆)的建立。

 

分享到:
评论

相关推荐

    特殊的数据结构-堆.pptx

    特殊的数据结构-堆.pptx

    数据结构-优先队列-堆排序

    如题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    数据结构---堆排序

    比较详细地讲述了堆排序的思路和代码实现,适合初学者

    数据结构-堆及其应用PPT

    本资源是博文【数据结构】有关堆你知多少?的配套演示资料,包含堆的结构、堆的调整算法、堆的两种应用的动画演示。可结合以下博文查看:http://t.csdn.cn/ahdIh

    数据结构-快速和堆排序.ppt

    数据结构-快速和堆排序.ppt该文档详细且完整,值得借鉴下载使用,欢迎下载使用,有问题可以第一时间联系作者~

    考研-数据结构-殷人昆.zip

    1.1 针对考研数据结构的代码书写规范以及C 与C 语言基础1 1.1.1 考研综合应用题中算法设计部分的代码书写规范1 1.1.2 考研中的C 与C 语言基础3 1.2 算法的时间复杂度与空间复杂度分析基础 12 1.2.1 考研中的算法时间...

    《数据结构-堆排序》

    《数据结构》严蔚敏版 堆排序

    数据结构-3期(KC002) 堆排序算法.docx

    数据结构-3期(KC002) 堆排序算法.docx 学习资料 复习资料 教学资源

    数据结构-堆(Heap)介绍和Java示例代码

    介绍数据结构堆(Heap)的概念、特点、优缺点、适用场景和Java示例代码

    数据结构-从应用到实现 (java版)

    主要内容包括:算法效率的输入规模、阶和大O,数据结构的无序和有序列表,队列和栈基于数组和链表的设计实例,递归详解,二叉查找树和AVL树,堆、散列表和排序以及图论等。对于每一种数据结构的性质和用途,《计算机...

    数据结构-排序.doc

    数据结构--内部排序算法 1、下列排序算法中,_____________排序在某趟结束后不一定能选出一个元素放到其最 终的位置上。 (1)选择 (2)冒泡 (3)归并 (4)堆 2、下列排序算法中,依次将待排序列中的元素和前面...

    数据结构--算法相关.zip

    基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,...

    基础算法与数据结构 -- Java 实现.zip

    算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)...

    Java语言编写的数据结构-排序

    Java语言编写的数据结构-排序。包括冒泡排序、选择排序、插入排序、希尔排序、快排、堆排序。

    数据结构--排序 很细致

    数据结构(C语言版) 第10章 排序 内 容 10.1 基本概念 10.2 冒泡排序 10.3 选择排序 10.4 插入排序 10.5 希尔排序 10.6 快速排序 10.7 堆排序 10.8 归并排序 10.9 基数排序

    数据结构-算法.zip

    算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)...

    数据结构-利用堆分配方式实现串的操作C语言

    这是我买的一本课程设计案例书上的源代码,上面的案例很经典,特别适合于作 毕业设计的学生使用,当然了,也可以做为做课程设计的学生以参考,希望能给 大家提供帮助!!

    精心整理史上最全的数据结构flash演示动画,共5个版本,祝大家考研成功!

    \数据结构flash演示\版本1\10-1-1插入排序.swf \数据结构flash演示\版本1\10-2-2直接插入排序.swf \数据结构flash演示\版本1\10-2-3折半插入排序.swf \数据结构flash演示\版本1\10-2-4-1直接插入排序.swf \数据...

    数据结构-串

    1、采用堆分配存储建立一个串,并实现串的赋值、比较、联结、求子串、求串的长度、串复制等基本操作。 2、串的模式匹配

    数据结构-利用堆分配方式实现串的操作

    这是一个利用堆分配方式实现串的基本操作的小程序,用C++ 写的,欢迎修改指正!

Global site tag (gtag.js) - Google Analytics