ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:108.77KB ,
资源ID:3606898      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3606898.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于选择排序方法的类模板设计与实现c课程设计毕设论文.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于选择排序方法的类模板设计与实现c课程设计毕设论文.docx

1、基于选择排序方法的类模板设计与实现c 课程设计毕设论文 成 绩 评 定 表学生姓名吴琼班级学号专 业通信工程课程设计题目基于选择排序方法的类模板设计与实现评语组长签字:成绩日期 20 年 月 日课程设计任务书学 院信息科学与工程专 业通信工程学生姓名吴琼班级学号课程设计题目基于选择排序方法的类模板设计与实现实践教学要求与任务建立一维数组数据结构的模板类,使一维数组中的数据元素可以是char, int, float等多种数据类型,并对数组元素实现选择类排序。主要完成如下功能:(1) 实现数组数据的输入和输出;(2) 实现简单选择排序功能;(3) 实现树形选择排序功能;(4) 实现堆排序功能;(5

2、) 将每种排序功能作为类的成员函数实现,编写主函数测试上述排序功能。工作计划与进度安排第17周:分析题目,查阅课题相关资料,进行类设计、算法设计;第18周:程序的设计、调试与实现;第19周:程序测试与分析,撰写课程设计报告,进行答辩验收。指导教师: 201 年 月 日专业负责人:201 年 月 日学院教学副院长:201 年 月 日摘 要计算机中存储的数据,初始时没有任何排列规律,根据实际需求,经常要排列成有规律的数据序列也就是将数据序列按关键字升序或降序规律排列。选择排序是排序法中很经典的算法,选择排序法可以分为简单选择排序、树形选择排序和堆排序。本文采用C+语言实现了选择排序功能,设计了模板

3、类,实现了int型float型和char型数组的排序,设计了简单选择排序、树形选择排序和堆排序的三个函数体,采用Visual C+ 6.0的控制台工程和MFC工程分别实现了各类型数组的排序,通过对两种程序的测试结果表明:简单选择排序是选择排序的基础,而树形选择排序和堆排序是简单选择排序的改进。关键词:模板类;简单选择排序;树形选择排序;堆排序;控制台工程;MFC工程。目 录1 需求分析 12 算法基本原理 13 类设计 34 基于控制台的应用程序 34.1 类的接口设计 44.2 类的实现 44.3 主函数设计 94.4 基于控制台的应用程序测试 115 基于MFC的应用程序 135.1 基于

4、MFC的应用程序设计 135.1.1 MFC程序界面设计 135.1.2 MFC程序代码设计 155.2基于MFC的应用程序测试 21结 论 22参考文献 231 需求分析(1)当进行数据处理时,经常遇到需要进行查找操作,通常希望待处理的数据按关键字大小有序排序,因为这样就可以采用查找效率较高的查找算法。(2)对有序的顺序表可以采用查找效率较高的折半查找算法,而对无序的顺序表只能采用顺序查找算法。由此可见排序是计算机程序设计中一种基础性操作,研究和掌握各种排序方法是非常重要的。(3)排序算法对于计算机信息处理很重要,一个好的排序不仅可以使信息 查找的效率提高,而且直接影响着计算机的工作效率。本

5、实验题目为基于选择排序方法的类模板设计与实现,要求建立一维数组数据结构的模板类,使一维数组中的数据元素可以是char, int, float等多种数据类型,并对数组元素实现选择类排序。因此实验采用类模板,可以对不同的数据类型的数据进行排序,并通过函数采用不同的方法进行排序。2 算法基本原理(1)简单选择排序从无序的记录序列中选出一个关键字值最小的记录存入到指定的位置。/简单选择排序SelectSort(Type ar) int i,j; Type t; for(i=1;ilen;i+) for(j=i+1;jarrayj) t=arrayi;arrayi=arrayj;arrayj=t;(2)

6、树形选择排序树形选择排序的基本思想:树形选择排序又称锦标赛排序(Tournament Sort),是一种按照锦标赛的思想进行选择排序的方法。首先对n个记录的关键字进行两两比较,然后在n/2个较小者之间再进行两两比较,如此重复,直至选出最小的记录为止。 (3)堆排序堆排序由建初始堆和调整堆两个过程组成。再次,所谓筛选是指对一棵左右子树均为堆的完全二叉树,经调整根节点后使之成为堆的过程。建堆时一定要从最后一个非叶子结点开始。堆排序的关键是调整堆,建初始堆时也是要从最后一个非叶子结点开始向根结点方向进行调整建堆。假设完全二叉树的第i个结点的左子树,右子树已是堆,则对第i个结点进行调整时,需要将r2i

7、.key与r2i+1.key之中的最大者与ri.key进行比较,若ri.key较小则与之交换。这有可能破坏下一级的堆,因此,需要继续采用上述方法调整构造下一级的堆。如此反复,直到将以第i个结点为根的子树构成堆为止。算法:HeapSort(Type ar) int i; Type t; /循环建立初始堆for(i=len/2;i=1;i-) AdjustTree(array,i,len); /进行n-1次循环,完成堆排序for(i=len;i=2;i-) t=arrayi; arrayi=array1; array1=t; AdjustTree(array,1,i-1); 3 类设计从上面的算法

8、分析可以看到,本设计面临的问题的关键是类模板。可以定义一个模板类sort,模板类sort功能有输入,输出数组,用三种方法对数组进行排序。从问题的需要来看,在模板类中定义三个成员函数。成员函数SelectSort()对数组进行简单选择排序,成员函数tree_select_sort()对数组进行树形选择排序,成员函数HeapSort()对数组进行堆排序。成员函数AdjustTree()通过始建和调整堆辅助堆排序,而成员函数write( ) 和print( ) 输入输出数组。主函数中应用if( ) 判断语句确定数组数据类型,swich()语句选择使用的排序方法。定义了两个对象分别是整型和字符型的。类

9、用template 限定,其中的数据类型用type代替,所有的成员函数都用template 修饰,使之能适用于多种数据类型。4 基于控制台的应用程序整个程序只用一个独立的文档,文件中包含一个模板类,主函数中定义多个对象来实现调用三个成员函数对数组进行简单选择排序,树形选择排序,堆排序这三种排序,在此定义了三个对象分别是整型、字符型和浮点型的。4.1 类的接口设计#include#include#include#include#define num 50#define M 50#define MIN_VALUE -10000templateclass Sort public: /外部接口 voi

10、d AdjustTree(Type ar,int n,int k); void write(); void SelectSort(Type ar); void tree_select_sort(Type arr,int n); void HeapSort(Type ar); void print(); int len; Type arraynum; ;在此定义了模板类,类中所有的成员函数和成员变量均定义为public的公有类型,是类的对外接口,数据类型用type代替。成员函数在类中只有函数类型,函数名,参数,对函数进行内部声明,函数体在类体外定义4.2 类的实现/简单选择排序template

11、void Sort:SelectSort(Type ar) int i,j; Type t; for(i=1;ilen;i+) for(j=i+1;jarrayj) t=arrayi;arrayi=arrayj;arrayj=t;template void Sort:tree_select_sort(Type arr,int n) /树形选择排序Type treeM; / 树 int baseSize; / 当n是2的幂次时,baseSize是n, 当n不是时,baseSize是大于n的最小的2的幂次 / 就是构造成满二叉树的最下层的大小,即叶子数 int i;Type max; / 最大值

12、int maxIndex; / 最大数的下标 int treeSize; / 最终这棵树会达到的大小 baseSize = 1;while (baseSize n) baseSize *= 2;treeSize = baseSize * 2 - 1;/满二叉树的所有结点个数等于叶子数的2倍减一for (i = 0;i n;i+) / 从数组的后面部分开始填充, 不使用tree0 treetreeSize - i = arri;for (;i 1;i -= 2)/ 以arri和arri + 1为子结点的数的根是arri和arri + 1中的较大者 treei / 2 = (treei treei

13、 - 1 ? treei : treei - 1);n = n - 1; /此时的n表示当前tree1应该放到arr中的位置 / 不断把树中值为最大值的结点移走,直到n的值为-1 while (n != -1) max = tree1; arrn- = max; maxIndex = treeSize;/ 在叶子上找到最大值对应的下标 while (treemaxIndex != max) maxIndex-; treemaxIndex = MIN_VALUE; / 沿着叶子上的结点到根的路径更新 while (maxIndex 1) / 当结点还有父结点时 if (maxIndex % 2

14、= 0) / 如果值为最大值的结点是左子结点 / 用子结点中较大值代替父结点 treemaxIndex / 2 = (treemaxIndex treemaxIndex + 1 ? treemaxIndex : treemaxIndex + 1); else / 如果不是左子结点 / 用子结点中较大值代替父结点 treemaxIndex / 2 = (treemaxIndex treemaxIndex - 1 ? treemaxIndex : treemaxIndex - 1); maxIndex /= 2; / 继续处理父结点 template void Sort:AdjustTree(Ty

15、pe ar,int k,int n) /调整堆 int i,j; i=k; j=2*i; /arrauj是arrayi的左孩子 Type temp=arrayi; while(j=n) if(jn&arrayjarrayj+1) /若有孩子较大,把j指向右孩子 j=j+1; if(temparrayj) arrayi=arrayj; /arrayj调整到双亲结点 i=j; j=2*i; else break; arrayi=temp;template void Sort:HeapSort(Type ar) /堆排序 int i; Type t; for(i=len/2;i=1;i-) /循环建

16、立初始堆 AdjustTree(array,i,len); for(i=len;i=2;i-) /进行n-1次循环,完成堆排序 t=arrayi; arrayi=array1; array1=t; AdjustTree(array,1,i-1); templatevoid Sort:write() /输入数组int i,l;printf(请输入数组长度:);scanf(%d,&l);len=l;printf(请输入数组元素:n);for(i=1;iarrayi;templatevoid Sort:print() /输出数组int i; printf(排序后的数组为:n); for(i=1;i=

17、len;i+) coutarrayi ; coutendl;在类的成员函数实现过程中,系统会自动为类产生构造函数,类的构造函数自动调用,为类动态分配了内存空间,整个调用过程中完全是由系统内部完成。成员函数对成员变量进行操作,实现排序功能,通过for( ) 循环,实现输入输出数组元素的功能。4.3 主函数设计在程序的主函数部分,选择了分别以int、char和float型为数据类型的对象作为实际例子来验证算法。首先,选择数据类型;然后,通过write( ) 函数对成员变量数组array 进行赋值,通过swich()语句选择排序方式,用对象调用对应的成员函数实现数组排序;最后,通过print()函数

18、输出排序后的结果。void main() /主函数 int i,j=1; Sort s; Sort p; Sort z; cout选择输入类型:1.int 2.char 3.floati;if(i=1) s.write(); cout请选择排序方式:1.简单选择排序 2.树形选择排序 3.堆排序i; switch(i) case 1:s.SelectSort(s.array);break; case 2:s.tree_select_sort(s.array,s.len+1);break; case 3:s.HeapSort(s.array);break; default:break; s.pr

19、int();else if(i=2) p.write(); cout请选择排序方式:1.简单选择排序 2.树形选择排序 3.堆排序i; switch(i) case 1:p.SelectSort(p.array);break; case 2:p.tree_select_sort(p.array,p.len+1);break; case 3:p.HeapSort(p.array);break; default:break; p.print();else if(i=3) z.write(); cout请选择排序方式:1.简单选择排序 2.树形选择排序 3.堆排序i; switch(i) case

20、1:z.SelectSort(z.array);break; case 2:z.tree_select_sort(z.array,z.len+1);break; case 3:z.HeapSort(z.array);break; default:break; z.print();4.4 基于控制台的应用程序测试(1) 用简单选择排序进行int类型的排序图1(2) 用树形选择排序进行char类型的排序图2 (3)用堆排序进行float类型的排序图35 基于MFC的应用程序MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序与DOS界面程序的主要不同点是:MFC图形界面程序

21、与DOS界面程序的输入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,主要通过cin,cout等I/O流实现,而MFC的图形程序界面采用标准Windows窗口和控件实现输入输出,因此必须在MFC类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成。5.1.1 MFC程序界面设计首先在VC中建立MFC AppWizard(exe)工程,名称为1203060128,并在向导的Step1中选择基本对话框,即建立基于对话框的应用程序,如下图4、图5所示。图4建立MFC AppWizard(exe)工程图5 建立基于对话框的应用程序将对话框资源中的默认对话框利用工具箱

22、改造成如下界面,如图6所示。图6 选择排序方法的实现界面设计图3所示的界面中包含了2个Static Text控件,3个Button控件,和10个Edit Box控件, 控件的基本信息列表如下表1所示。表1 控件基本信息Static TextIDC_STATIC输入前输入后BottonIDC_BUTTON_1简单选择排序IDC_BUTTON_2树形选择排序IDC_BUTTON_3堆排序Edit BoxIDC_EDIT_m1 IDC_EDIT_m5输入的5个元素IDC_EDIT_m6 IDC_EDIT_m10输出的5个元素5.1.2 MFC程序代码设计为了能够将对话框界面上的控件能够与代码联系起来

23、,需要为10个Edit Box控件建立Member Variables,按Ctrl+w键进入MFC ClassWizard界面,选择Member Variables选项卡,可显示成员变量设置界面,如图7所示。图7 成员变量设置界面通过该界面设置与10个Edit Box控件对应的成员变量,具体如表2所示。表2 控件基本信息控件ID成员变量类型成员变量名称IDC_EDIT_m1 IDC_EDIT_m5Intm_1m_5IDC_EDIT_m6 IDC_EDITm_10Intm_6m_10下面是编写代码的重要阶段(1)简单选择排序int a5;UpdateData(true);a0=m_l1;a1=m

24、_l2;a2=m_l3;a3=m_l4;a4=m_l5; int i,j,k; int temp; int len=5; for(i=0;i=len;i+) k=i; for(j=i+1;jaj) k=j; if(k!=i) temp=ak; ak=ai; ai=temp; m_l6=a0; m_l7=a1; m_l8=a2; m_l9=a3; m_l10=a4;UpdateData(false);(2)树形选择排序 int a5; UpdateData(true); a0=m_l1; a1=m_l2; a2=m_l3; a3=m_l4; a4=m_l5; char tree50; /树 in

25、t max;/最大值 int baseSize; int i; int maxIndex;/最大值的下标 int treeSize;/最终这棵树会达到的大小 int len=5; int MIN_VALUE=0; baseSize=1; while(baseSizelen) baseSize*=2; treeSize=baseSize*2-1; for(i=0;ilen;i+) treetreeSize-i=ai; for(;i1;i-=2) treei/2=(treeitreei-1?treei:treei-1); len=len-1; while(len!=-1) max=tree1; a

26、len-=max; maxIndex=treeSize; while(treemaxIndex!=max) maxIndex-; treemaxIndex=MIN_VALUE; while(maxIndex1) if(maxIndex%2=0) treemaxIndex/2=(treemaxIndextreemaxIndex+1?treemaxIndex:treemaxIndex+1); else treemaxIndex/2=(treemaxIndextreemaxIndex-1?treemaxIndex:treemaxIndex-1); maxIndex/=2; m_l6=a0; m_l7=a1; m_l8=a2; m_l9=a3; m_l10=a4;UpdateData(false);(3)堆排序int a5; UpdateData(true);a0=m_l1;a1=m_l2;a2=m_l3;a3

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1