堆排序算法课程设计.docx
- 文档编号:8558516
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:10
- 大小:172.76KB
堆排序算法课程设计.docx
《堆排序算法课程设计.docx》由会员分享,可在线阅读,更多相关《堆排序算法课程设计.docx(10页珍藏版)》请在冰豆网上搜索。
堆排序算法课程设计
数据结构课程设计
设计说明书
堆排序的算法的实现
学生姓名
学号
班级
成绩
指导教师
计算机科学与技术系
2011年3月4日
数据结构课程设计评阅书
题目
堆排序原理的算法的实现
学生姓名
学号
指导教师评语
成绩:
指导教师签名:
年月日
答辩教师评语
成绩:
答辩教师签名:
年月日
教研室意见
成绩:
室主任签名:
年月日
注:
指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。
课程设计任务书
2010—2011学年第二学期
专业:
学号:
姓名:
课程设计名称:
数据结构课程设计
设计题目:
堆排序算法的实现
完成期限:
自2011年2月19日至2011年3月4日共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)能够实现数据个数的变化输入,并建立相应的堆。
指导教师(签字):
教研室主任(签字):
批准日期:
年月日
摘要
设计了一个堆排序算法实现的程序,此程序具有排序的功能,能够对输入的任何数字进行处理之后,有序的输出。
在设计之前,首先要明白什么是堆,以及堆排序的原理,明白了原理之后,结合之前所掌握的C++编程知识,分部分进行编译,最后再进行组合,完成此程序之后,可视化界面比较清晰,操作比较简单,易于为用户接受。
关键词:
堆排序;大顶堆;筛选
1.课题描述
本课题是利用堆排序的算法原理对数据进行排序,使所输入的数据以递减或者递增的方式输出,主要是利用堆排序算法进行设计,设计筛选函数,和排序函数,以及对这些函数的综合运用。
2.问题分析和任务定义
本次程序设计,主要设计的问题是如何利用堆排序原理进行设计,应该结合书本所含有的理论,结合一些程序实例,进行完成,本次设计的任务是,编一个能够实现堆排序算法的程序,并设计一个可视化界面,此次程序设计过程中,有两大模块,一个是筛选函数,另一个是排序函数。
3.逻辑设计
运用数据结构中所学的函数进行流程图设计。
堆排序主函数
结束
3.1堆排序主函数流程图
大顶堆筛选函数
结束
3.2堆排序筛选函数
大顶堆排序函数
3.3堆排序排序函数
4.程序编码
#include
#include
usingnamespacestd;
voidBigHeapAdjust(int*p,intr,intlen);
voidBigHeapSort(int*p,intlen);
intmain()
{
intarray[1000]={0};
intn;
printf("请输入排序元素的个数:
");
scanf("%d",&n);
printf("请输入要排序的元素:
");
for(inti=0;i scanf("%d",array+i); BigHeapSort(array,n); printf("结果是: "); for(intk=0;k printf("%d",array[k]); getchar(); getchar(); getchar(); return0; } voidBigHeapAdjust(int*p,intr,intlen) { inttmp=p[r]; intj; for(j=2*r+1;j<=len-1;j=2*j+1) { if(j ++j; if(tmp>=p[j]) break; p[r]=p[j]; r=j; } p[r]=tmp; } voidBigHeapSort(int*p,intlen) { inti,j; for(i=len/2-1;i>=0;--i) BigHeapAdjust(p,i,len); p[0]^=p[len-1]; p[len-1]^=p[0]; p[0]^=p[len-1]; for(j=len-1;j>1;--j) { BigHeapAdjust(p,0,j); p[0]^=p[j-1]; p[j-1]^=p[0]; p[0]^=p[j-1]; } } 5.结果分析 5.1.输入界面 5.1输入要排序的函数个数 5.2输入元素的个数 5.2输入所要排序的函数 5.3程序运行结果 5.3函数结果输出 5.4函数异常输入 5.4函数异常输出结果 6.总结 在本次程序设计中,运用了堆排序的基本原理,在首先了解什么事堆的情况下,然后结合所学的知识进行编程,在编程的过程中,首先要了解大顶堆,小顶堆的定义,以及如何利用堆排序的原理进行排序,在设计程序之前,应先画出流程图,在画图的过程中,应该正确了解各个图形的意义,不能错用,对于经常使用的选择,判断等的特殊图形要正确使用,以及箭头所指的方向,都要仔细,在完成了对流程图的设计后,就要根据流程图进行编程,在编程的时候,首先要明白程序的主题函数,先从主函数开始,结合流程图进行编译,正确使用特殊语句,以及关键字,在这过程要用到for循环语句,最重要的就是要写出正确的判断语句,搞清楚程序的结束的点,在完成主函数的编译之后,就要进行子函数的编译,次函数包括两个子函数,一个是大顶堆的筛选,另一个是大顶堆的排序,在大顶堆的筛选的时候,要明白堆排序的实质,就是从最后一个非叶子节点开始,从它的左右子树开始比较,顺着子树较大的方向往父节点平移,最后和序列的最后一个数据进行交换,把它放置在闲置的空间内,在进行大顶堆的排序的时候,对上面的交换完成之后,先找出一个最大的,然后对其余的数据进行重复的比较,方法和大顶堆的筛选一样,直至待排序的数据按顺序输出。 在编程的完成之后,要进行仔细的检验,找出错误,进行多次验证,确保此程序准确无误,并且要使程序简单明了,便于操作者使用方便。 在进行了此次程序设计之后,明白了如何利用堆排序原理进行对数据的排序,对以前所学的知识进行了巩固,增加了实践的经验。 参考文献 [1]严蔚敏,吴伟民.数据结构(C语言版)[M].北京: 清华大学出版社,2002 [2]李春葆.数据结构(C语言版)习题与解析[M].北京: 清华大学出版社,2002 [3]钱能.C++程序设计教程[M].北京: 清华大学出版社,2003 [4]谭浩强.C程序设计教程.北京: 清华大学出版社2007 [5]李建忠.大学计算机基础.西北大学出版社2005 [6]罗建军 朱丹军 刘路放.C++程序设计教程(第2版).北京: 高等教育出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 算法 课程设计