- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
兰州大学信息科学与工程学院
数据结构实验报告
课程名称
实验名称
专业班级
姓 名
学 号
实验日期
周—佳期日,三四节
实验地点 贺兰堂
2012—2013学年度第一学期
一、实验目的
1、熟悉堆排序方法
二、 实验内容
1、 假设有一个数据类型为整型的一维数组A, A中的数据元素呈无序状态,
编写一个采用堆排序法将A中的数据元素按由小到大进行排序的程序。
三、 实验环境
1、 硬件配置:Pentium (R) Dual-Core9 CUP E6500 @2. 93GHz, 1.96 的内存
2、 软件环境:Microsoft Windows XP Professional Service Pack 3, Microsoft Visual C++ 6. 0
四、 需求分析
1、 输入的形式和输入值的范围:根据题H要求与提示输入排序的数据总数,和参与比 较的数据。
2、 输出的形式:输出从大到小的排序结果。
3、 程序所能达到的功能:输出排序后的结果。
4、 测试数据:输入数据总数,回车。输入具体数据,数据以空格隔开。如:
数据总数:5
比较的数据:56 8 12 3 96
输出的数据为:96 56 12 8 3.
五、 概要设计
为了实现上述操作,应以数组为存储结构。
1、基本操作:
int compare ( int n , int m)
初始条件:存在参与比较的整型数据叫m
操作结果:如果mn返回1,否则返回0。
void headadjust( int *h , int s , int m )
初始条件:存在整型的数组的指针h,数据起始位置s,结束位置m;
操作结果:对编号s到m的数组中的数据进行筛选,成为根节点较大数据的堆。
void headsort (int *h, int count)
初始条件:存在整型数组指针h,数组内数据的总数count;
操作结果:使整型数组内的数据进行堆排序。
2、 本程序包含二个模块:
(1) 主程序模块;
(2) 数值比较函数,筛选堆函数,堆排序函数模块
(3) 模块调用图:
主程序模块
堆排序函数模块 筛选堆函数模块 数值比较函数模块
3、 流程图
主函数模块
屏幕上输出“请输入排序数据的总数”
将总数赋值给count
将需要排序的数据存在整型数组h
调用堆排序函数
输出堆排序后的结果
数值比较函数
输入需要比较的数据m,n
是
mn
否
返回1
返回0
进行数据筛选生成大顶堆
存在整型数组指针h,进行堆筛选的起始位置s,结束位置m
rc记录数据的根节点
初始位置j = 2 *s ;直到j〈m,每次循环j二2*j
是
j且两个叶节点左节点是否大于右节点
否
j ++
否
根节点是否小于叶节点
是
h[s] = h[j] 跳出循环
交换初始位置和数值较大的叶节点的值
堆排序函数
i的初始值从中间编号循环到等于0 ,每次循环i数值减一
调用筛选堆函数(h, i , count)
i的值从数组长度循环到0 ,每次循环i的值减一
将堆顶记录和当前未经排序子序列[0?i ]中最后一个记录相互交 换
将[0?i 一1]重新调整为大顶堆
六、详细设计
1、 存储类型,元素类型,结点类型:
int h[]
元素类型为整形数组。
2、 每个模块的分析:
(1)主程序模块:
voi d main ()
{
int count, h[20], i;
printfC请输入排序数据的总数:〃);
scanf(%d〃,count);
printfC请输入数据:〃);
for (i=0;icount;i++)
scanf h[i]);//输入数据
headsort ( h , count) ;//对数据进行堆排序
printfC数据从大到小的排序结果为:〃);
for (i=0;icount;i++)
printf (*%d , h[i]);//输出数据的排序结果
printfC\n/z);
}
(2)比较函数模块
int compare ( int n , int m)
{〃进行数据hi, n的比较
if (nm)
return 1;//如果m大于n,返回1
else
return 0;//否则返回0
筛选堆函数模块
void headadjust( int *h , int s , int m )
{//进行筛选堆
int rc, j;
rc = h[s];//记录根节点的初始位置
for ( j = 2*s; j = m ; j *= 2)
{
if ((j m) compare (h[j], h[j+1]))//对两个叶节点进行比较
j++;
if (!compare(rc, h[j]))//如果叶节点中出现更大的数据,停止循坏
break;
h[s] = h[j];
s = J
您可能关注的文档
最近下载
- 全国各省江氏辈分收集.docx
- smt工艺制程详细流程图.pdf VIP
- 清华附小推荐1-6年级必读书.xlsx VIP
- GSK980TDb 车床CNC使用手册(2010年3月第2版)(全版).pdf VIP
- 妇产科护理学试题(答案).docx VIP
- 主题活动-我们的校园 第3课时 活动四(分层作业)数学青岛五四版二年级上册(新教材).docx
- 2025年4月自考10194书籍装帧试题.pdf
- 2025陕西寰宇正信科技产业发展有限公司招聘(71人)笔试备考题库及答案解析.docx VIP
- 汽车租赁服务投标文件(技术方案).doc
- 4.1 水循环 课件 高一上学期 地理 湘教版(2019)必修一.pptx
文档评论(0)