数据结构课程设计报告.docx
- 文档编号:10906959
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:31
- 大小:179.55KB
数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(31页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告
滨江学院
数据结构课程设计报告
(2011--2012年度第2学期)
课程名称:
数据结构
题目:
排序系统设计
院系:
滨江学院计算机系
班级:
软降工程动漫
(1)班
学号:
20102359024
姓名:
徐希芝
指导教师:
李振宏
设计周数:
两周
日期:
2012年5月24日
目录
一.设计目的3
二、需求分析3
2.1选题的意义及背景3
2.2输入/输出形式和输出值的范围4
三.概要设计4
3.1设计思想4
3.2函数间的关系4
四、详细设计5
4.1哈夫曼的主要结构5
4.1.1结构定义5
4.1.2主要函数声明及功能描述6
4.2源程序7
4.2.1头文件7
4.2.2源文件8
五.程序测试结果及问题分析14
5.1程序测试结果14
5.2问题分析15
六.总结15
七.参考文献16
一.设计目的
数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。
因此,主要有三个方面的内容:
数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
在当今信息时代,信息技术己成为当代知识经济的核心技术。
我们时刻都在和数据打交道。
比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。
实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。
数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:
1、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
二、需求分析
2.1选题的意义及背景
排序(Sorting)是指将一个数据元素序列排列成为一个有序序列的过程。
排序是计算机科学的一个重要领域,并广泛应用于数据处理,情报检索,商业金融及企业管理等许多方面。
资料表明,在当今的计算机系统中,有50%以上的CPU时间是用在排序数据上的。
目前人们已经提出了许多不同的排序算法,本文选择其中最基本也是最常用的一些算法进行讨论,介绍它们的基本思想和实现过程,分析各种算法的时间与空间复杂度,以清晰描述排序演示系统。
作为计算机科学中一项复杂而重要的技术,排序一直是计算机领域内人们感兴趣的课题,寻找速度快、附加存储空间开销小的高效排序算法也一直是人们追寻的目标。
本文讨论整数数组元素的排序,分析几种常见排序算法并进行比较。
排序是程序设计中非常重要的内容,每一种程序设计语言中都涉及到排序,它的功能是将一组无序的数据序列变成有序的数据序列,结果一般只有两种情况:
数据从大到小排列或者从小到大排列。
排序的算法有很多种,常用的有三种,即冒泡排序、选择排序和插入排序。
要判断排序算法的优劣,一般有两个标准:
一是算法执行所需的时间,又称时间复杂度;二是算法所需的存储空间,又称空间复杂度。
排序算法的优劣将直接影响到程序的性能。
随着计算机技术的飞速发展,排序(Sorting)仍将成为计算机科学的一个重要组成部分。
早期计算机多用于进行简单的数值计算,输入和输出的数据量不大,数据元素之间的关系较为简单,数据处理时间较长,但是自从第一台计算机诞生,随着操作系统从简单到复杂,从低级到高级的发展,排序速度也越来越快,当处理大批量数据,特别是成千上万的数据时,时间也挺长,但是效率已相当高了。
操作系统大概经历了以下几个阶段:
一.手工操作阶段二.早期批量处理阶段三.管理程序阶段四.多道程序设计与多道批处理系统。
有了这许多硬件和软件的支持,排序算法的实现就有了强大的支撑力,从而为我们的计算机科学注入了活力。
计算机已经深入到人类社会的各个领域,其应用已经不再局限于科学计算,而更多用于控制,管理及数据处理等非数值计算的处理工作。
另外,计算机加工处理的对象由纯粹的数值发展到字符,表格和图象等各种具有一定结构的数据,这就必须分析待处理对象的特性以及各处理对象之间存在的关系,而排序是其中必不可少的一份子。
所以展望计算机世界,数据结构是它的支持框架,而作为数据结构中排序一大块,其作用是非同小可的,我们不再论述,且用我们有限的时间去不断学习计算机这门科学,让它为我们的学习生活服务。
另一方面,锻炼我们的编码能力,真正理解数据结构的编码思想,并且锻炼我们的动手能力和成员间的配合,提高程序编写能力。
在信息传递时,希望长度能尽可能短,即采用最短码。
赫夫曼编码的应用,就是采用这种有效的数据压缩技术可以节省数据文件的存储空间和计算机网络的传送时间。
2.2输入/输出形式和输出值的范围
1.输入模块:
利用随机函数产生N个数,产生的数据个数由用户自己输入。
2.输出模块:
输出排序前的,或者排序后的数据元素到屏幕上显示,并且输出某一种算法排序后的数据元素到文件中保存。
三.概要设计
3.1设计思想
这是一个关于排序的综合系统,该系统包含就平时记录操作中比较常见的几种排序方法;其中包括的排序算法有:
直接插入排序、希尔排序、冒泡排序、非递归的快速排序、递归的快速排序、简单排序、堆排序。
应用该系统可以完成数据记录的排序操作。
对不同的数据量、不同的数据结构可以采用不同的排序方法。
3.2函数间的关系
程序流程:
模块设计:
以VisualC++编写一个基于对话框的程序,我们假设待排序的数字的总数为10,排序的整个过程为(每个步骤对应一个按钮):
(1)数字分散:
模拟编号分散开来的过程
对应的按钮为:
IDC_BUTTON1
按钮标题为:
编号分散
(2)分配数字:
模拟给每个编号一个3位或4位的数字的过程
对应的按钮为:
IDC_BUTTON2
按钮标题为:
产生数字
(3)集合:
所有编号在获得数字后,为进行排序,他们需要先集合
对应的按钮为:
IDC_BUTTON3
按钮标题为:
编号集合
(4)排序:
a.
对应的按钮为:
IDC_BUTTON4
按钮标题为:
冒泡排序
b.交换排序
对应的按钮为:
IDC_BUTTON5
按钮标题为:
交换排序
c.选择排序
对应的按钮为:
IDC_BUTTON6
按钮标题为:
选择排序
整个对话框的消息映射关系为:
BEGIN_MESSAGE_MAP(CMy520Dlg,CDialog)
//{{AFX_MSG_MAP(CMy520Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
ON_BN_CLICKED(IDC_BUTTON3,OnButton3)
ON_BN_CLICKED(IDC_BUTTON4,OnButton4)
ON_BN_CLICKED(IDC_BUTTON5,OnButton5)
ON_BN_CLICKED(IDC_BUTTON6,OnButton6)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
四、详细设计
4.1随机数生成的设计及注释
Srand((unsigned)time(NULL));
//产生10个3/4位的数
For(inti=0;i<10;i++)
{
inttemp;
Temp=rand();
If(temp%2==0)
//产生3位数
{
While(temp%1000<100)
{
Temp=rand();
}
sortObject[i].iNumber=temp%1000;
}
else
//产生4位数
{
While(temp%10000<1000)
{
Temp=rand();
}
sortObject[i].iNumber=temp%10000;
}
4.2排序介绍
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。
内部排序和外部排序:
若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序;
反之,若参加排序的记录数量很大,
整个序列的排序过程不可能在内存中
完成,则称此类排序问题为外部排序。
内部排序的过程是一个逐步扩大
记录的有序序列长度的过程。
内排序的方法有许多种,按所用策略不同,可归纳为五类:
插入排序、选择排序、交换排序、归并排序和分配排序。
其中,插入排序主要包括直接插入排序和希尔排序两种;选择排序主要包括直接选择排序和堆排序;交换排序主要包括气(冒)泡排序和快速排序}
4.3各种排序算法介绍
4.3.1冒泡排序
冒泡排序的基本概念是:
依次比较相邻的两个数,将大数放在前面,小数放在后面。
即首先比较第1个和第2个数,将大数放前,小数放后。
然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放前,小数放后,此时第一趟结束,在最后的数必是所有数中的最小数。
重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将大数放前,小数放后,一直比较到最小数前的一对相邻数,将大数放前,小数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。
如此下去,直至最终完成排序。
由于在排序过程中总是大数往前放,小数往后放,相当于气泡往上升,所以称作冒泡排序。
用二重循环实现,外循环变量设为i,内循环变量设为j。
外循环重复9次,内循环依次重复9,8,...,1次。
每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i,j的值依次为1,2,...10-i。
产生
在许多程序设计中,我们需要将一个数列进行排序,以方便统计,常见的排序方法有冒泡排序,二叉树排序,选择排序等等。
而冒泡排序一直由于其简洁的思想方法和比较高的效率而倍受青睐。
排序过程
设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。
算法示例
4913131313131313
3849272727272727
6538493838383838
9765384949494949
7697654949494949
1376976565656565
2727769776767676
4949497697979797
ProcedureBubbleSort(VarR:
FileType)//从下往上扫描的起泡排序//
Begin
ForI:
=1ToN-1Do//做N-1趟排序//
begin
NoSwap:
=True;//置未排序的标志//
ForJ:
=N-1DownTo1Do//从底部往上扫描//
begin
IfR[J+1] begin Temp: =R[J+1];R[J+1: =R[J];R[J]: =Temp; NoSwap: =False end; end; IfNoSwapThenReturn//本趟排序中未发生交换,则终止算法// end End;//BubbleSort// 该算法的时间复杂性为O(n2),算法为稳定的排序方 冒泡排序算法具体代码 #include voidBubbleSort(int*pData,intCount) { intiTemp; for(inti=1;i { for(intj=Count-1;j>=i;j--) { if(pData[j] { iTemp=pData[j-1]; pData[j-1]=pData[j]; pData[j]=iTemp; } } } } voidmain() { intdata[]={10,9,8,7,6,5,4}; BubbleSort(data,7); for(inti=0;i<7;i++) cout< cout<<"\n"; } 冒泡排序Ruby代码 defbubble(arr) (arr.length-1).downto (1)do|j| a1=arr.dup j.timesdo|i| ifarr>arr[i+1] arr,arr[i+1]=arr[i+1],arr end end breakifa1==arr end arr end 冒泡排序法的改进 比如用冒泡排序将4、5、7、1、2、3这6个数排序。 在该列中,第二趟排序结束后,数组已排好序,但计算机此时并不知道已经反排好序,计算机还需要进行一趟比较,如果这一趟比较,未发生任何数据交换,则知道已排序好,可以不再进行比较了。 因而第三趟比较还需要进行,但第四、五趟比较则是不必要的。 为此,我们可以考虑程序的优化。 为了标志在比较中是否进行了,设一个布尔量flag。 在进行每趟比较前将flag置成true。 如果在比较中发生了数据交换,则将flag置为false,在一趟比较结束后,再判断flag,如果它仍为true(表明在该趟比较中未发生一次数据交换)则结束排序,否则进行下一趟比较。 性能分析 若记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。 因此冒泡排序总的时间复杂度为O(n*n)。 4.3.2交换排序 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位 置,交换排序的特点是: 将键值较大的记录向序列的尾部移动,键值较小的记录向序 列的前部移动。 4.3.3选择排序 1.基本思想: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 2.排序过程: 【示例】: 初始关键字[4938659776132749] 第一趟排序后13[38659776492749] 第二趟排序后1327[659776493849] 第三趟排序后132738[9776496549] 第四趟排序后13273849[49976576] 第五趟排序后1327384949[976576] 第六趟排序后132738494965[9776] 第七趟排序后132738494976[9776] 最后排序结果1327384949767697 3. voidselectionSort(Type*arr,longlen) { longi=0,j=0;/*iteratorvalue*/ longmaxPos; assertF(arr! =NULL,"InInsertSortsort,arrisNULL\n"); for(i=len-1;i>=1;i--) { maxPos=i; for(j=0;j if(arr[maxPos] if(maxPos! =i)swapArrData(arr,maxPos,i); } } 选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的元素,则将那个更小的元素的下标赋给临时变量,最后,在二层循环退出后,如果临时变量改变,则说明,有比当前外层循环位置更小的元素,需要将这两个元素交换. 4.4排序算法设计代码及注释 4.4.1冒泡排序 CClientDCdc(this); dc.SetBkColor(RGB(180,180,180)); intobjectName[SORT_OBJECT_NUM];//每个位置对应的成员名 //初始化每个位置对应的成员 for(inti=0;i { objectName=i; } //冒泡排序 for(i=1;i { for(intj=SORT_OBJECT_NUM-1;j>=i;j--) { if(sortObject[objectName[j]].iNumber { //交换成员序号 intiTemp; iTemp=sortObject[objectName[j-1]].iSeq; sortObject[objectName[j-1]].iSeq=sortObject[objectName[j]].iSeq; sortObject[objectName[j]].iSeq=iTemp; //交换成员位置 iTemp=objectName[j]; objectName[j]=objectName[j-1]; objectName[j-1]=iTemp; //显示新位置 CStringstrName; CStringstrNum; //显示j-1位置的成员 strName.Format("%d",objectName[j-1]); dc.TextOut(objectCoord[sortObject[objectName[j-1]].iSeq].x-5, objectCoord[sortObject[objectName[j-1]].iSeq].y-8,strName); if(sortObject[objectName[j-1]].iNumber<1000) { strNum.Format("%d",sortObject[objectName[j-1]].iNumber); } else { strNum.Format("%d",sortObject[objectName[j-1]].iNumber); } dc.TextOut(objectCoord[sortObject[objectName[j-1]].iSeq].x-15, objectCoord[sortObject[objectName[j-1]].iSeq].y-30,strNum); //显示j位置的成员 strName.Format("%d",objectName[j]); dc.TextOut(objectCoord[sortObject[objectName[j]].iSeq].x-5,objectCoord[sortObject[objectName[j]].iSeq].y-8,strName); if(sortObject[objectName[j]].iNumber<1000) { strNum.Format("%d",sortObject[objectName[j]].iNumber); } else { strNum.Format("%d",sortObject[objectName[j]].iNumber); } dc.TextOut(objectCoord[sortObject[objectName[j]].iSeq].x-15, objectCoord[sortObject[objectName[j]].iSeq].y-30,strNum); //延迟1秒进行下一次排序以便将排序过程显示为动画 Sleep(1000); } } } 通过运行上述程序,我们非常清晰地看到了较小的数冒泡的全过程,这是缘于我们在每次排序之间利用Sleep(1000)插入了1秒钟的延迟。 下面是我们追踪所得的一次冒泡排序的轨迹: 196399320372953318281557709607325486 196399320372953318281557709604867325 196399320372953318281557704869607325 196399320372953318281548657709607325 196399320372953318486281557709607325 196399320373182953486281557709607325 196399331820372953486281557709607325 196318399320372953486281557709607325 196318399320372953486281596057707325 196318399320372953486960281557707325 196318399320374862953960281557707325 196318399348620372953960281557707325 196318486399320372953960281557707325 196318486399
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)