内部堆排序课程设计说明书.docx
- 文档编号:3018131
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:26
- 大小:232.72KB
内部堆排序课程设计说明书.docx
《内部堆排序课程设计说明书.docx》由会员分享,可在线阅读,更多相关《内部堆排序课程设计说明书.docx(26页珍藏版)》请在冰豆网上搜索。
内部堆排序课程设计说明书
数据结构课程设计
设计说明书
内部堆排序算法的实现
学生姓名
金强胜
学号
0918014051
班级
计本092
成绩
指导教师
申静
计算机科学与技术系
2011年9月9日
数据结构课程设计评阅书
题目
内部堆排序算法的实现
学生姓名
金强胜
学号
0918014051
指导教师评语及成绩
指导教师签名:
年月日
答辩评语及成绩
答辩教师签名:
年月日
教研室意见
总成绩:
室主任签名:
年月日
课程设计任务书
2011—2012学年第一学期
专业:
计算机科学与技术学号:
0918014051姓名:
金强胜
课程设计名称:
数据结构课程设计
设计题目:
内部堆排序算法的实现
完成期限:
自2011年8月29日至2011年9月9日共2周
设计依据、要求及主要内容:
堆实质上是满足如下性质的完全二叉树:
树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。
如关键字序列(10,15,56,25,30,70)和(70,56,30,25,15,10)分别满足堆性质
(1)和
(2),故它们均是堆。
大根堆和小根堆:
根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆,又称最小堆。
根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆。
注意:
①堆中任一子树亦是堆。
②以上讨论的堆实际上是二叉堆(BinaryHeap),
大根堆排序的基本思想:
①先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区。
②再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key。
③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。
然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
要求:
(1)给出一个符合堆序列的一组数,能够建立大根堆和小根堆。
(2)界面友好,可操作性强。
(3)能够实现数据个数的变化输入,并建立相应的堆。
指导教师(签字):
教研室主任(签字):
批准日期:
年月日
摘要
随着计算机技术的发展,为了查找方便,通常希望通过排序使表是按关键字有序的。
本课题利用简单选择排序中的堆排序方法,通过建立大、小根堆,并对数据元素进行排序输出,实现对用户输入的一组可以组成堆的数据元素进行处理,使其按关键字排成为一个有序的序列,从而有效地提高了查找效率。
关键词:
堆;排序;查找
目录
1课题描述1
2设计过程2
2.1流程图2
2.1.1函数设计思想流程图2
2.1.2程序流程图2
2.2分步程序设计7
2.2.1建立堆函数7
2.2.2输出堆函数7
2.2.3输出已排序数组函数9
2.2.4主函数9
3测试12
3.1第一组测试数据测试结果12
3.2第二组测试数据测试结果13
总结16
参考资料17
附录18
程序源代码18
1课题描述
随着计算机技术的发展,为了查找方便,通常希望计算机中的表是按关键字有序的。
因为有序的顺序表可采用查找效率较高的折半查找法,而无序的表只能进行顺序查找。
排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。
因此,学习和研究各种排序方法是计算机工作者的重要课题之一。
本课题利用简单选择排序中的堆排序方法,通过对用户输入的可以组成堆的数据元素建立大、小根堆,并将其进行排序输出,使其成为一个按关键字排序的有序序列,从而有效地提高了查找的效率。
开发工具:
TC2.0
2设计过程
2.1流程图
2.1.1函数设计思想流程图:
函数设计思想流程图如图2.1。
图2.1函数设计思想流程图
2.1.2程序流程图
建立大根堆函数的程序流程图如图2.2。
图2.2建立大根堆函数的程序流程图
建立小根堆函数的程序流程图如图2.3。
图2.3建立小根堆函数的程序流程图
输出大根堆函数的程序流程图如图2.4。
图2.4输出大根堆函数的程序流程图
输出小根堆函数的程序流程图如图2.5。
图2.5输出小根堆函数的程序流程图
2.2分步程序设计
2.2.1建立堆函数
当运行程序,用户按照提示输入正确的信息并敲击回车键时,程序就会相应地建立出大、小根堆函数,为后续的运行做准备。
程序源代码如下:
//建立大根堆函数
voidbuildbig(int*a,inti,intn){
inttmp;
k=i;
j=2*k+1;
while(j<=n){
if(j j++; if(a[k]>=a[j])break; tmp=a[k]; a[k]=a[j]; a[j]=tmp; k=j; j=2*j+1; } } //建立小根堆函数 voidbuildlittle(int*a,inti,intn){ inttmp; k=i; j=2*k+1; while(j<=n){ if(j j++; if(a[k]<=a[j])break; tmp=a[k]; a[k]=a[j]; a[j]=tmp; k=j; j=2*j+1; } } 2.2.2输出堆函数 当计算机已经生成了相应的堆函数之后,就会自动运行此模块,将其输出。 程序源代码如下: //输出大根堆函数 voidprnthpbig(int*a,intb1,intb2){ intsize; inth=0,sum=0,item=1; inti,j,cnt,start,tmp; size=b2-b1+1; while(sum<=size){ sum+=item; h++; item*=2; } item=1; cnt=0; start=b1; tmp=1; printf("───────────────────────\n"); printf("▼大根堆排序如下: ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); while (1){ for(i=0;i for(j=0;j printf(""); for(j=0;j for(j=0;j if(cnt>size-1)gotoend; printf("%4d",a[cnt++]); } printf("\n"); tmp*=2; } } end: printf("\n"); return; } //输出小根堆函数 voidprnthplittle(int*a,intb1,intb2){ intsize; inth=0,sum=0,item=1; inti,j,cnt,start,tmp; size=b2-b1+1; while(sum<=size){ sum+=item; h++; item*=2; } item=1; cnt=0; start=b1; tmp=1; printf("───────────────────────\n"); printf("▲小根堆排序如下: ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); while (1){ for(i=0;i for(j=0;j printf(""); for(j=0;j for(j=0;j if(cnt>size-1)gotoend; printf("%4d",a[cnt++]); } printf("\n"); tmp*=2; } } end: printf("\n"); return; } 2.2.3输出已排序数组函数 输出已经排好的序列数据,显示每一步排序出的结果。 源代码如下: //输出已排序数组函数 voidprntar(int*a,intb2,intlen){ inti; printf("○已排序序列数如下: ┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); for(i=0;i printf(""); } for(i=b2;i<=len;i++){ printf("%3d",a[i]); } printf("\n"); } 2.2.4主函数 运行程序时,在用户数据输入正确之后,主函数运行并调用相应的函数,完成全部任务。 源代码如下: main(){ inta[50]; inti; inttmp; intsum; intlen; printf("╭━━━━━━━━━━━━━━━━━━━━━━╮\n"); printf("┃───计本092金强胜0918014051────┃\n"); printf("┃┃\n"); printf("┃──────(数据结构课程设计)──────┃\n"); printf("┃─────内部堆排序算法的实现─────┃\n"); printf("╰──────────────────────╯\n"); printf("★请您输入欲排序数的个数,并以回车键结束: "); scanf("%3d",&len); printf("┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄\n"); printf("★请输入能组建堆的无序序列数的值,并以回车键结束: \n"); for(i=0;i scanf("%3d",&a[i]); tmp=1;sum=0; while(sum+tmp<=len){ sum+=tmp; tmp*=2; } //建初始堆 for(i=sum-1;i>=0;i--) buildbig(a,i,len-1); prnthpbig(a,0,len-1); //改建堆 for(i=0;i tmp=a[0]; a[0]=a[len-1-i]; a[len-1-i]=tmp; buildbig(a,0,len-2-i); prnthpbig(a,0,len-2-i); prntar(a,len-1-i,len-1); } printf("\n───────────────────────\n"); printf("★大根堆排序的最后结果如下: ┈┈┈┈┈┈┈┈┈┈\n"); prnt(a,len); printf("\n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内部 排序 课程设计 说明书
![提示](https://static.bdocx.com/images/bang_tan.gif)