




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、成绩评定表学生姓名秦丽婷班级学号1103060208专业通信工程课程设计题目基于选择排序方法的类 模板设计与实现评语组长签字:成绩日期20 年 月日课程设计任务书学院信息科学与工程专业通信工程学生姓名秦丽婷班级学号1103060208课程设计题目基于选择排序方法的类模板设计与实现实践教学要求与任务建立一维数组数据结构的模板类,使一维数组中的数据兀素口以是char, int, float等多种数据类型,并对数组元素实现选择类排序。主要完成如下功能:(1) 实现数组数据的输入和输出;(2) 实现简单选择排序功能;(3) 实现树形选择排序功能;(4) 实现堆排序功能;(5) 将每种排序功能作为类的成
2、员函数实现,编写主函数测试上述排序功能。工作计划与进度安排第17周:分析题目,查阅课题相关资料,进行类设计、算法设计;第18周:程序的设计、调试与实现;第19周:程序测试与分析,撰写课程设计报告,进行答辩验收。指导教师:201 年 月日专业负责人:201 年 月日学院教学副院长:201 年 月日摘要计算机中存储的数据,初始时没有任何排列规律,根据实际需求,经常要排列成有规律的数据序列也就是将数据序列按关键字升序或降序规律排列。本文采用c+语言实现了选择排序功能, 设计了模板类, 采用 visual c+ 6.0 的控制台工程和 mfc 工程分别实现了简单选择排序,树形选择排序,堆排序,通过对两
3、种程序的测试结果表明:三种选择排序算法原理正确,两种程序均能正确对给定数组排序。关键词:模板类;简单选择排序;树形选择排序;堆排序; mfc 工程。1 需求分析 1.2 算法基本原理 1.3 类设计 3.4 基于控制台的应用程序 3.4.1 类的接口设计 4.4.2 类的实现4.4.3 主函数设计 9.4.4 基于控制台的应用程序测试1.15基于mfc勺应用程序135.1 基于mfc勺应用程序设计 135.1.1 mfc 程序界面设计135.1.2 mfc 程序代码设计155.2 基于mfc勺应用程序测试 21结论 2.2.参考文献 2.3.1 需求分析排序是现实世界中经常进行的一种操作。 计
4、算机中存储的数据, 初始时没有任何排列规律, 根据实际需求, 经常要排列成有规律的数据序列也就是将数据序列按关键字升序或降序规律排列。本此实验题目为 基于选择排序方法的类模板设计与实现,要求建立一维数组数据结构的模板类,使一维数组中的数据元素可以是char, int, float 等多种数据类型,并对数组元素实现选择类排序。 因此实验采用类模板, 可以对不同的数据类型的 数据进行排序,并通过函数采用不同的方法进行排序。2 算法基本原理( 1)简单选择排序从无序的记录序列中选出一个关键字值最小的记录存入到指定的位置。/简单选择排序selectsort(type ar)int i,j;type t
5、;for(i=1;i<len;i+)for(j=i+1;j<=len;j+)if(arrayi>arrayj)t=arrayi;arrayi=arrayj;arrayj=t; ( 2)树形选择排序树形选择排序是一种借助于锦标赛方式的选择排序方法。锦标赛的本思想是通过分组淘汰决出冠军, 亚军一定是从输给冠军的选手中选手中产生, 季军定是从输给亚军的选手中产生的树形选择排序使用近似为完全二叉树的树形, 所有记录均为叶子节点从叶子结点开始, 通过两两比较填到树顶结点是对应关键字最小的记录, 然后将该叶子结点关键字置成最大关键字, 继续选出第二个最小值。如此重复进行,直到排序结束。(
6、 3) 堆排序堆排序就是利用堆的特性对记录序列进行排序的一种方法。具体做法是:先建一个大顶堆, 即先选的一个关键字最大的记录, 然后与序列中最后一个记录交换,再对序列中前n-1 条记录进行“筛选” ,重新将它调整成为一个大顶堆,再将堆顶记录和第 n-1 个记录交换。如此反复进行,直到所有记录有序为止。实质上, 堆排序由建初始堆和调整堆两个过程组成。再次,所谓筛选是指对一棵左右子树均为堆的完全二叉树, 经调整根节点后使之成为堆的过程。 建堆时一定要从最后一个非叶子结点开始。堆排序的关键是调整堆, 建初始堆时也是要从最后一个非叶子结点开始向根结点方向进行调整建堆。 假设完全二叉树的第 i 个结点的
7、左子树, 右子树已是堆,则对第i个结点进行调整时,需要将r2i.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
8、=t;adjusttree(array,1,i-1);3 类设计从上面的算法分析可以看到, 本设计面临的问题的关键是类模板。 可以定义 一个模板类sort,模板类sort功能有输入,输出数组,用三种方法对数组进行排 序。从问题的需要来看,在模板类中定义三个成员函数。成员函数selectsort()对数组进行简单选择排序,成员函数tree_select_sort ()对数组进行树形选择排序,成员函数heapsort ()对数组进行堆排序。成员函数adjusttree ()通过始建和调整堆辅助堆排序,而成员函数write( ) 和 print( ) 输入输出数组。主函数中应用if()判断语句确定数
9、组数据类型,swich ()语句选择使用的排序方法。 定义了两个对象分别是整型和字符型的。类用template<class type>限定,其中的数据类型用type代替,所有的成员 函数都用template<class type>修饰,使之能适用于多种数据类型。4 基于控制台的应用程序整个程序只用一个独立的文档, 文件中包含一个模板类, 主函数中可以定义多个对象来实现调用成员函数对数组进行排序, 在此举例定义了两个对象分别是 整型和字符型的。4.1 类的接口设计#include<stdio.h>#include<string.h>#include
10、<stdlib.h>#include<iostream.h># define num 50# define m 50# define min_value -10000template<class type>class sortpublic:/外部接口void 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;
11、type arraynum;在此定义了模板类, 类中所有的成员函数和成员变量均定义为 public 的公有类型,是类的对外接口,数据类型用type代替。成员函数在类中只有函数类型,函数名,参数,对函数进行内部声明,函数体在类体外定义4.2 类的实现/简单选择排序template <class type>void sort<type>:selectsort(type ar)int i,j;type t;for(i=1;i<len;i+)for(j=i+1;j<=len;j+)if(arrayi>arrayj) t=arrayi;arrayi=arrayj
12、;arrayj=t;template <class type>void sort<type>:tree_select_sort(type arr,int n) /树形选择排序type treem; / 树int basesize; / 当 n 是 2 的幕次时,basesizeh n,当 n 不是时,basesize!大于n 的最小的 2 的幂次/ 就是构造成满二叉树的最下层的大小,即叶子数int i;type max; / 最大值int maxindex; / 最大数的下标int treesize; / 最终这棵树会达到的大小basesize = 1;while (b
13、asesize < n)basesize *= 2;treesize = basesize * 2 - 1;/满二叉树的所有结点个数等于叶子数的/2倍减一for (i = 0;i < n;i+)/ 从数组的后面部分开始填充 , 不使用 tree0treetreesize - i = arri;for (;i < basesize;i+) / 用 min_value 填充 tree,直到一共有 basesize个treetreesize - i = min_value;/ 构造一棵树for (i = treesize;i > 1;i -= 2)/ 以 arri 和 arr
14、i + 1 为子结点的数的根是arri 和 arri + 1 中的较大者treei / 2 = (treei > treei - 1 ? treei : treei - 1);n = n - 1; 此时的n表示当前tree1应该放到arr中的位置/ 不断把树中值为最大值的结点移走,直到 n 的值为 -1while (n != -1)max = tree1;arrn- = max;maxindex = treesize;/ 在叶子上找到最大值对应的下标while (treemaxindex != max)maxindex-;treemaxindex = min_v alue;/ 沿着叶子上
15、的结点到根的路径更新while (maxindex > 1) / 当结点还有父结点时if (maxindex % 2 = 0) / 如果值为最大值的结点是左子结点/ 用子结点中较大值代替父结点treemaxindex / 2 = (treemaxindex > treemaxindex + 1 treemaxindex : treemaxindex + 1);else / 如果不是左子结点/ 用子结点中较大值代替父结点treemaxindex / 2 = (treemaxindex > treemaxindex - 1 treemaxindex : treemaxindex
16、- 1);maxindex /= 2; / 继续处理父结点template <class type>void sort<type>:adjusttree(type ar,int k,int n) /调整堆int i,j;i=k;j=2*i; /arrauj 是 arrayi 的左孩子type temp=arrayi;while(j<=n)if(j<n&&arrayj<arrayj+1) /若有孩子较大,把j 指向右孩子j=j+1;if(temp<arrayj)arrayi=arrayj; /arrayj 调整到双亲结点i=j;j=
17、2*i;else break;arrayi=temp;template <class type>void sort<type>:heapsort(type ar)/堆排序int i;type t;for(i=len/2;i>=1;i-)/循环建立初始堆adjusttree(array,i,len);for(i=len;i>=2;i-)/进行 n-1 次循环,完成堆排序t=arrayi;arrayi=array1;array1=t;adjusttree(array,1,i-1);template<class type>void sort<ty
18、pe>:write() /输入数组int i,l;printf(" 请输入数组长度:");scanf("%d",&l);len=l;printf(" 请输入数组元素 :n");for(i=1;i<=l;i+)cin>>arrayi;template<class type>void sort<type>:print()/输出数组int i;printf(" 排序后的数组为 :n");for(i=1;i<=len;i+)cout<<arrayi&
19、lt;<" "cout<<endl;在类的成员函数实现过程中, 系统会自动为类产生构造函数, 类的构造函数自动调用,为类动态分配了内存空间,整个调用过程中完全是由系统内部完成。成员函数对成员变量进行操作,实现排序功能,通过for( ) 循环,实现输入输出数组元素的功能。4.3 主函数设计void main()/主函数 int i,j=1;sort<int> s;sort<char> p;cout<<”选择输入类型:1 int 2 char"cin>>i;if(i=j)s.write();cout&l
20、t;<"请选择排序方式:1.简单选择排序2.树形选择排序3.堆排序”;cin>>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.print();elsep.write();cout<<"请选择排序方式:1.简单选择排序2.树形选择排序3.堆排序”;cin>>i;switch(i)case 1:p.
21、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();在程序的主函数部分,选择了分别以int和char型为数据类型的对象作为实际例子来验证算法。首先,选择数据类型,然后,通过write( ) 函数对成员变量数组array进行赋值,通过swich ()语句选择排序方式,用对象调用对应的成员函数实现数组排序,最后,通过print ()函数输出排序后的结果。4.4 基于控制台的应用程序测试图1
22、程序运行结果图1为简单选择排序运行结果,数据类型为int型图2程序运行结果图2为树形选择排序运行结果,数据类型为int型图3程序运行结果图3为堆排序运行结果,数据类型为int型。25图4程序运行结果图4为简单选择排序运行结果,数据类型为char-o图5程序运行结果图5为树形选择排序运行结果,数据类型为char。 " calbe rslenov odelicto pdebugll.exeizz1惬择输入类型二1 int 2 chai-z 福义数组长度二4请编人数组元素:c b d a罪鬻序方式:1 .简单选择排序2 .树形选择排序3 .堆排序?数组为:111g a1金y t。 c
23、71;nt in图6程序运行结果图6为堆排序运行结果,数据类型为 char型5基于mfc勺应用程序mfc的图形界面程序设计可在上述类设计的基础上进行改造,mfc的图形界面程序与dos界面程序的主要不同点是:mfc图形界面程序与dos界面程 序的输入输出方式不同,dos界面程序采用字符交互式实现数据输入输出,主 要通过cin, cout等i/o流实现,而mfc的图形程序界面采用标准 windows窗 口和控件实现输入输出,因此必须在 mfc类的框架下加入上面所设计的矩阵和 方程组类,并通过图形界面的输入输出改造来完成。5.1 基于mfc勺应用程序设计5.1.1 mfc程序界面设计首先在vc中建立
24、 mfc appwizard (exe)工程,名称为sort,并在向导的 step1中选择dialog based,即建立基于对话框的应用程序,如下图 78所示。files plugsother docunicnucom ari wizardcluster resource type wizardcullum appwizdrjsdatabnt project国devstudm add-in wizard 甫 fsftrndrd srnrrrt prnn wi7arrlproject name:l fination:g:忖udyf匕kem的传中文版v上.cisapi extciilun wiz
25、ard 但 wkchi。族 mfc adivex contra i wizard< mfc appa/i7»fd flllj0mfc appwizard |exe) 品nc* ottabaac w?z*rd 事 utility project3win32 apfiliralinnzjwln32 console applkauon, win32 dyimink-liiik library 目 win32 static library存 create new works时。c arid to cuireht warpaee dependency of:piatlorms:zin32
26、cantd图 7 建立 mfc appwizard (exe)工程图8建立基于对话框的应用程序将对话框资源中的默认对话框利用工具箱改造成如下界面,如图9所示图9数组排序程序界面设计an ab| o lx 国国 ee图 奉mi o-i 隰 国展 b 脑目 h旧图9所示的界面中包含了 2个static text控件,3个button控件,和8个editbox控件,控件的基本信息列表如下表 1所示。表1控件基本信息控件类别控彳id控件 caption说明static textidc_static数组排序后数组bottonidc_button_read简单选择排序idc_button_calc树形选择
27、排序idc_button_exit堆排序edit boxidc edit a00 idc edit a07数组a的8个元素5.1.2 mfc程序代码设计为了能够将对话框界面上的控件能够与代码联系起来,需要为8个edit box控件建立 member variables,按 ctrl+w 键进入 mfc classwizard 界面,选择member variables选项卡,可显示成员变量设置界面,如图 10所示图10成员变量设置界面通过该界面设置与8个edit box控件对应的成员变量,具体如表 2所示表2控件基本信息控件id成员变量类型成员变量名称idc edit a00 idc edit
28、 a33intm a00m a08dos 界面的控制台应用程序的代码,并将其作必要的改写,具体程序如下:void csortdlg:onbutton1()/ todo: add your control notification handler code here int a4;updatedata(true);a0=m_a00;a1=m_a01;a2=m_a02;a3=m_a03;int i,j,k;int temp;int len=4;for(i=0;i<=len;i+) k=i;for(j=i+1;j<=len;j+)if(ak>aj)k=j;if(k!=i)temp=
29、ak;ak=ai;ai=temp;m_a04=array 0;m_a05=array 1;m_a06=array 2;m_a07=array 3;updatedata(false);void csortdlg:onbutton2()/ todo: add your control notification handler code hereint a4;updatedata(true);a0=m_a00;a1=m_a01;a2=m_a02;a3=m_a03;type treem; / 树int basesize; / 当 n 是 2 的幕次时,basesizeh n,当 n 不是时,bases
30、ize!大于 n 的最小的 2 的幂次/ 就是构造成满二叉树的最下层的大小,即叶子数int i;type max; / 最大值int maxindex; / 最大数的下标int treesize; / 最终这棵树会达到的大小basesize = 1;while (basesize < n)basesize *= 2;treesize = basesize * 2 - 1;/满二叉树的所有结点个数等于叶子数的/2倍减一for (i = 0;i < n;i+)/ 从数组的后面部分开始填充 , 不使用 tree0treetreesize - i = arri;for (;i < b
31、asesize;i+) / 用 min_value 填充 tree直到一共有 basesize4v treetreesize - i = min_value;/ 构造一棵树for (i = treesize;i > 1;i -= 2)/ 以 arri 和 arri + 1 为子结点的数的根是arri 和 arri + 1 中的较大者treei / 2 = (treei > treei - 1 ? treei : treei - 1);n = n - 1; 此时的n表示当前tree1应该放到arr中的位置/ 不断把树中值为最大值的结点移走,直到 n 的值为 -1while (n !=
32、 -1)max = tree1;arrn- = max;maxindex = treesize;/ 在叶子上找到最大值对应的下标while (treemaxindex != max)maxindex-;treemaxindex = min_value;/ 沿着叶子上的结点到根的路径更新while (maxindex > 1) / 当结点还有父结点时if (maxindex % 2 = 0) / 如果值为最大值的结点是左子结点/ 用子结点中较大值代替父结点1 ?treemaxindex / 2 = (treemaxindex > treemaxindex + treemaxindex
33、 : treemaxindex + 1);else / 如果不是左子结点/ 用子结点中较大值代替父结点treemaxindex / 2 = (treemaxindex > treemaxindex - 1 treemaxindex : treemaxindex - 1);maxindex /= 2; / 继续处理父结点m_a04=a 0;m_a05=a 1;m_a06=a 2;m_a07=a 3;updatedata(false);void csortdlg:onbutton3()/ todo: add your control notification handler code her
34、eint a4;updatedata(true);a 0=m_a00;a 1=m_a01;a2=m_a02;a 3=m_a03;int i,j;i=k;j=2*i; /arrauj 是 arrayi 的左孩子type temp=arrayi; while(j<=n)if(j<n&&arrayj<arrayj+1)/若有孩子较大,把j 指向右孩子j=j+1;if(temp<arrayj)arrayi=arrayj; /arrayj 调整到双亲结点i=j;j=2*i;else break;arrayi=temp;type t;for(i=len/2;i>=1;i-)/循环建立初始堆adjusttree(array,i,len);for(i=len;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 行政管理专科应试策略试题及答案汇聚
- 2025年经济法概论备考材料及试题答案
- 卫生资格考试热点话题试题及答案揭晓
- 2025年执业药师与公众健康的紧密联系试题及答案
- 指导患者用药的要点试题及答案
- 行政管理文化概论内容的扩展与试题及答案总结
- 自考行政管理经典试题及答案解析
- 护士执业考试试题及答案深层研究
- 行政管理法律解析试题与答案
- 理解国粹的试题及答案
- 蔬菜营养学复习课件
- DBJ∕T13-356-2021 市政道路沥青路面施工全过程质量管理标准
- xx学校研学旅行活动告家长书
- 医院检验科实验室生物安全管理委员会及工作职责
- 艾里逊自动变速箱针脚图PPT通用课件
- 圣地非遗-鲁锦纹样特征
- 自动扶梯标准安装施工方案
- 化探取样规范
- 起重机械交叉作业安全措施
- MBR运行管理手册(共21页)
- 生态动力素讲解话术
评论
0/150
提交评论