十二、堆 堆的定义.

Slides:



Advertisements
Similar presentations
人 工 智 慧 報 告 五子棋AI設計 報告者 : 潘輝銘.
Advertisements

计算机三级考试C语言上机试题专题.
四資二甲 第三週作業 物件導向程式設計.
程序设计实习 3月份练习解答
第一章 面向对象程序设计.
第九章 排序 插入排序 交换排序 选择排序 归并排序 基数排序.
引入树 线性表、堆栈和队列都是线性结构,它们的共同特点:一对一; 计算机对弈中的一个格局可能有多个后继格局,用线性结构难以描述。
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
類別與物件 Class & Object.
第三章 控制结构.
Chapter 7 Search.
程式設計實作.
第九章 排序 概述 插入排序 交换排序 选择排序 归并排序 基数排序 外排序.
Chap 3 堆疊與佇列 Stack and Queue.
第9章 排序.
Java 程式設計 講師:FrankLin.
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
哈夫曼编码.
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
第2章回顾 标识符:不用记,动手 关键字:if, else, switch, for, while, do, break, continue, void, …… 局部变量和成员变量 ①变量作用域 ②内存布局 基本数据类型 ①4类8种 ②互相转换 流程控制语句 ①分支 if……else, switch.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C#程序设计基础 $3 成员、变量和常量.
程序设计期末复习 黎金宁
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
五、链 表 1、单链表 2、双向链表 3、链表应用.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
Chapter4 Arrays and Matrices
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
Chapter6 队列(Queues) The Abstract Data Type
二叉树的遍历.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
辅导课程八.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第二章 数组 作为抽象数据类型的数组 顺序表 多项式抽象数据类型 稀疏矩阵 字符串 小结.
top b top a a top 空栈 a 进栈 b 进栈 top top e e e top d d d c c c b b b a a
第九章 排序 概述 插入排序 快速排序 交换排序(起泡排序) 选择排序 归并排序.
C++复习2----类与对象.
保留字與識別字.
第二章 Java基本语法 讲师:复凡.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
演算法時間複雜度 (The Complexity of Algorithms)
字符串 (String) 字符串是 n (  0 ) 个字符的有限序列, 记作 S = “c1c2c3…cn” 其中,S 是串名字
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第二章 Java基本语法 讲师:复凡.
第二章 语言设计问题.
累堆排序法 (Heap Sort).
订单汇总单功能详解 -芜花.
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
辅导课程十一.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
第七章  数 组.
第2章 Java语言基础.
迴圈(重複性結構) for while do while.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
判斷(選擇性敘述) if if else else if 條件運算子.
本节内容 在堆中创建对象 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++程序语言设计 Chapter 14: Templates.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二章 Java基本语法 讲师:复凡.
Presentation transcript:

十二、堆 堆的定义

堆是结点间具有层次次序关系的完全二叉树。其定义如下: 有一个关键码的集合K = {k0,k1,k2,…,kn-1},相应的元素按 堆的定义 堆是结点间具有层次次序关系的完全二叉树。其定义如下: 有一个关键码的集合K = {k0,k1,k2,…,kn-1},相应的元素按 完全二叉树存放于一个一维数组,并满足 ki≤k2i+1 且ki≤k2i+2 (ki≥k2i+1 且ki≥k2i+2 ) (i = 0, 1, …, ︱(n-1) /」) 称这个集合为最小堆(或最大堆)。 最小堆 最大堆 09 87 17 78 53 65 45 87 45 65 09 31 78 23 53 31 17 23

堆类 堆类说明 template<class T> class Heap { private: T*hlist; int inArray; int maxheapsize; // 堆中可存放的元素的最大个数 int heapsize; // 最后一个元素位置 void error(char errmsg[ ]); void FilterDown(int i); // 向下调整 void FilterUp(inr i); // 向上调整 public: Heap(int maxsize); // 建立空堆 Heap(T arr[ ], int n); // 对数组arr调整成堆 Heap(const Heap<T>& H); ~Heap(void);

堆类(续) (续上页) 堆类说明 // 重载运算符:“=”,“[ ]”,“T*” Heap<T>& operator = (const Heap<T>& rhs); const T& operator[ ] (int i); // 有关的表函数 int ListSize(void) const; int ListEmpty(void) const; int ListFull(void) const; void Insert(const T& item); T Delete(void); void ClearList(void); };

删除总是在根处,拿根与表尾交换,实际是删除表尾 堆元素的插入与删除 堆元素的插入 总是添加在表尾,然后再调整成堆 堆元素的删除 删除总是在根处,拿根与表尾交换,实际是删除表尾 10 10 40 30 25 30 45 25 45 40 25 25 15 30 30 15 × 40 10 40 10

堆元素的插入 FilterUp算法 void Heap <T>∷FileterUp(int i) { int currentpos, parentpos; // 前者为遍历双亲路径上结点的下标,后者为双亲 T target; // target为hlist[i]的值 currentpos = i; parentpos = (i-1)/2; target = hlist[i]; while (currentpos ! = 0) // 沿双亲路径搜索 if (hlist[parentpos]<= target) break; // 满足堆条件,退出遍历 else { hlist[currrentpos] = hlist[parentpos]; // 交换,双亲值下移 currentpos = parentpos; parentpos = (current -1)/2;} } hlist[currentpos] = target; // 将插入值赋入确定的位置

堆元素的插入(续) Insert算法 template<T> void Heap<T>∷Insert(const T& item) { if(heapsize = = maxheapsize) // 堆满出错 error(“Heap full”); // 将元素插入堆尾 hlist[heapsize] = item; // 用Filterup调整堆 FilterUp(heapsize); // 堆大小加1 heapsize + +; }

从上至下调整堆 Filter Down算法 template<T> void Heap<T>∷FilterDown(int i) { int currentpos, childpos; T target; currentpos = i; target = hlist[i]; childpos = 2*i + 1; while (childpos < heapsize) // 检查表是否结束 if ((childpos+1<heapsize)&& (hlist[childpos+1]<=hlist[childpos])) childpos = childpos+1; // 取较小的孩子

从上至下调整堆(续) Filter Down算法 if (target<=hlist[childpos] // 已是较小的孩子结点下标 break; else { hlist[currentpos] = hlist[childpos]; currentpos = childpos; childpos = 2*currentpos + 1; // 计算新的孩子结点下标 } hlist[currentpos] = target;

堆元素的删除