兰州大学数据实验堆排序实验报告.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档