应用堆实现一个优先队列.docx
- 文档编号:27485222
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:22
- 大小:179.71KB
应用堆实现一个优先队列.docx
《应用堆实现一个优先队列.docx》由会员分享,可在线阅读,更多相关《应用堆实现一个优先队列.docx(22页珍藏版)》请在冰豆网上搜索。
应用堆实现一个优先队列
沈阳航空航天大学
数据结构课程设计报告
题目:
应用堆实现一个优先队列
院(系):
理学院
专业:
信息与计算科学
班级:
学号:
姓名:
指导教师:
2011年12月
1题目介绍和功能要求
1.1优先队列(priorityqueue)
是不同于先进先出队列的另一种队列。
每次从队列中取出的是具有最高优先权的元素,它可以用于很多场合的数据结构。
1.2基本功能
1Insert(S,x)
将元素x插入到集合S(本题为数组A),并且把A调整为小头椎。
2Minimum(S0
返回S中的最小元素,并且将A调整为小顶椎。
3Extract_Min(S)
删除S中的最小关键字
1.3功能要求
可设计要求以堆作为辅助结构实现一个优先队列。
要将堆结构嵌入到队列结构中,以作为其数据组织的以部分。
此处由于要用堆实现队列,所以堆结构的储存表示要求用数组。
要求:
1.设计并实现优先队列的数据结构,包括其上的基本操作;
2.以堆结构为辅助结构实现优先队列的储存表示并实现其上的基本操作;
3.实现优先队列的出队、入队操作;
4.给出动态演示过程(选作);
2系统功能模块结构图
2.1系统功能结构框图
图2.1系统的模块图
2.2系统主要模块的功能说明
1.插入功能模块:
Insert(A,x)将元素x插入到数组A,并且把A调整为小头椎。
2.删除功能模块:
Extract_Min(A),删除数组A中的最小关键字,并且将A调整为小顶椎。
3.输出功能模块:
Print(A)把集合S中的元素按小头堆输出。
4.创建队列功能模块:
CreateHeap(A)对于数组A中元素创建小头椎。
5.返回最小优先级功能模块:
Minimun(A)返回集合A中优先级最小的堆
3使用的数据结构的描述
3.1数据结构设计
优先队列是不同于先进先出队列的另一种队列。
每次从队列中取出的是具有最高优先权的元素,按照题意可知,建立了小顶堆,元素越小优先级越高。
堆的定义:
若含n个元素的序列{k1,k2,…,kn},满足下列关系时称作"小顶堆"或"大顶
"。
"堆顶"元素为序列中的"最小值"或"最大值"。
堆举例:
{12,36,24,85,47,30,53,91}
12
36
24
85
47
30
53
91
为"小顶堆"
图3.1小顶堆
可将堆序列看成完全二叉树,则堆顶元素(完全二叉树的根)必为序列中
n个元素的最小值或最大值结合题目要求
3.2数据结构用法说明
从无序序列的第n/2个元素(即此无序序列对应的完全二叉树的最后一个非终端结点)起,至第一个元素止,进行反复筛选
例如:
无序序列建成一个小顶堆{49,38,65,97,76,13,27,49}
图3.2小顶堆调整a图3.3小顶堆调整b
图3.4小顶堆调整c图3.5小顶堆调整d
13
38
49
76
65
27
49
97
(e)
图3.6小顶堆调整e
4函数的描述
主要函数设计:
(1)voidPrint(int*a,intt)
作用:
输出优先队列
参数表:
a为存储优先队列的数组。
t为参数,为0是直接输出优先队列;否则对要变换元素进行标记。
如数字6:
为与3和7比较。
图4.1例图
(2)voidCreateHeap(int*a)
作用:
对于数组a进行调整为有小顶堆。
参数表:
a为存储优先队列的数组。
算法思想:
从无序序列的第n/2个元素(即此无序序列对应的完全二叉树的最后一个非终端结点)起,至第一个元素止,进行反复筛选,用递归方法调用HeapAdjust();
(3)HeapAdjust(int*a,ints,intm)
作用:
参数表:
a为存储优先队列的数组。
s为要调整的起始位置。
m为要调整的末端位置。
算法思想:
通过i个要满足且(i=s,2s,2s+1,3s…m/2)
(4)voidInsert(int*a,intx)
作用:
将x插入到优先队列a中并把a调整为小顶堆。
参数表:
x要插入的元素
a为存储优先队列的数组。
算法思想:
先将x插入到a的最后位置,然后判断
是否成立,成立则
互换,否则退出函数。
(5)intMinimun(int*a)
作用:
返回优先队列中优先级最高的元素(这为最小元素)。
参数表:
a为存储优先队列的数组。
算法思想:
由于用的是小顶堆,所以直接返回堆顶就行了。
(6)intExtract_Min(int*a)
作用:
从优先队列中删除优先级最高的元素(这为最小元素),并重新调整为小顶堆。
参数表:
a为存储优先队列的数组。
算法思想:
由于用的是小顶堆,所以直接返回堆顶,并删除堆顶,然后将堆的最后一个元素放到堆顶,在调用HeapAdjust(int*a,int1,intm)就行了。
5算法流程图
5.1HeapAdjust函数
、
图5.1HeapAdjust流程图
5.2CreateHeap函数
开始
输入a
i=a[0]/2
i>0
调用HeapAdjust(a,i,a[0])
结束
i=i-1;
N
Y
图5.2CreateHeap的流程图
5.3Print函数
开始
i=0,a
i 输出优先队列a[i] i=i+1 结束 Y N 图5.3Print函数的流程图 5.3Insert函数 图5.4Insert函数流程图 5.4Minimun函数 开始 输出a[1] 结束 图5.5Minimun函数流程图 5.5Extract_Min函数 图5.6Extract_Min函数流程图 6测试/运行的结果 例如: 输入{49,38,65,97,76,13,27,49}如下: 图6.1输入格式图 初始堆为: 图6.2初始堆 调整小顶堆过程为: 图6.3调整图 调整后的小顶堆为: 图6.4调整后小顶堆图 主函数功能操作如下: 图6.5主函数功能操作图 插入时选择功能1其输入如下: 图6.6插入操作图 插入过程如下: 图6.7插入过程图 返回最小值,选择功能4,结果如下: 图6.8返回最小值 删除时选择功能2其过程如下: 图6.9删除过程 删除后结果如下: 图6.10删除后结果 参考文献 [1]谭浩强著.C程序设计(第三版).北京: 清华大学出版社,2005 [2]数据结构: C语言版/严蔚敏,吴伟明编著.—北京: 清华大学出版社,2007 [3]汪杰.数据结构经典算法实现[M].北京: 人民邮电出版社,2004 [4]李春葆.数据结构解析(C语言版)[M].北京: 清华大学出版社,2002 课程设计总结: 经过一个星期的课程设计,过程曲折可谓一语难尽。 整天都是对着电脑,不然就是翻阅资料。 在此期间我失落过,也曾一度热情高涨。 点点滴滴令我回味无长。 这次课程设计使我体会到只有做到细心耐心,恒心才能做好事情。 根据我在课程设计中遇到得问题,我将在以后的学习过程中注意以下几点: 1、认真上好专业实验课,多在实践中锻炼自己。 2、写程序的过程中要考虑周到,严密。 3、在做设计的时候要有信心,有耐心,切勿浮躁。 4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。 通过这次的课程设计,让我更加了解到数据结构的重要性。 以及它对我们专业的发展发挥的作用。 对我们而言,知识上的收获很重要,但精神上的丰收更加可喜。 让我知道了学无止境的道理。 指导教师评语: 指导教师(签字): 年月日 课程设计成绩 附录 #include"stdafx.h" #include"stdio.h" #include #include #include #include"stdlib.h" #include #defineMAX100 #defineINF0.00001 voidPrint(int*a,intt) { inti,j,k,n,m; m=int(log(a[0])/log (2)+INF)+1; n=int(pow(2,m))-1; for(i=1;i<=m;i++) { for(k=int(pow(2,(i-1)));k<=int(pow(2,i))-1;k++) { if(k==a[0]+1)break; for(j=1;j<=n/2;j++) printf(""); if(k==t) printf("<%d>",a[k]); elseprintf("%d",a[k]); for(j=1;j<=n/2+1;j++) printf(""); } printf("\n"); n=n/2; } } voidHeapAdjust(int*a,ints,intm)//a[s+1...m]为小顶堆,调整后a[s...m]为小顶堆 { intj,ac=a[s]; for(j=2*s;j<=m;j*=2) { getchar(); Print(a,j/2); if(j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用 实现 一个 优先 队列