算法可视化演示软件开发毕业设计文档格式.docx
《算法可视化演示软件开发毕业设计文档格式.docx》由会员分享,可在线阅读,更多相关《算法可视化演示软件开发毕业设计文档格式.docx(42页珍藏版)》请在冰豆网上搜索。
并且在设计的过程中也能让学生更加的了解排序算法和实现过程,使他们在以后的学习和工作中能找到更加高效的排序系统,提高学习效果和工作效率。
第三节论文结构
本次的论文共有六个章节,详细的阐述了算法可视化的具体实现:
第一章,主要介绍了研究的背景、容、目的和意义。
第二章,简述相关的Java知识,进一步了解Java的发展史、特性,还介绍Java图形界面的相关知识和相关算的一些知识。
第三章,通过仔细研究,进行系统地需求分析。
第四章,明确项目模块,进行系统概要设计。
第五章,可视化算法的具体实现、与其功能。
第六章,系统测试,以与在做毕设的过程中遇到的问题,最后对本次毕设进行总结。
第二章相关知识概述
第一节Java知识相关概述
一、Java的发展史
Java是由Sun公司1995年5月开发的新一代面向对象编程语言(简称Java语言)和Java平台的总称。
Java的正式推出是1995年,它是JamesGosling和同事们一起研发的,HotJava浏览器是用Java实现的,它(支持Javaapplet)显示了Java的魅力:
动态的Web、跨平台、Internet计算。
它可以应用在各种不同的平台上,正逐步成为internet应用的主要开发语言。
此后,Java不仅被广泛承受还推动了Web的快速发展,我们所用的一般的浏览器均支持Javaapplet。
另一方面,Java技术也一直在更新。
Java是由四个方面组成的:
Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(JavaAPI)。
Java技术具有突出的的平台移植性、高效性、通用性和安全性,它应广泛的用于数据中心、个人PC、移动、游戏控制台、互联网以与科学超级计算机,并且在全球拥有的开发者专业社群是最大的。
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔的前景[4]。
二、Java的主要特性
Java的主要特性有平台无关性、安全性、面向对象特性、简单性、动态特性、多线程性、健壮性等特性[5]。
Java语言是体系结构中立的,是可移植的。
是解释型的,而且是高性能的,是动态的[6]。
Java语言的设计的其中一个目标就是要适应环境的动态变化。
能够把程序需要的类动态的载入到运行环境,同时所需要的类也可以通过网络载入。
这样对软件的升级很有用。
Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
Java语言的优良特性使得Java应用有很高的的可靠性和健壮性,同时应用系统维护的费用也相对减少了。
Java对对象技术的全面支持和Java平台嵌的API能减少应用系统的开发所需要的时间还能有效降低成本。
Java的编译一次,其随处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。
尤其是Java企业应用编程接口(JavaEnterpriseAPIs)为企业计算与电子商务应用系统提供了丰富的类库很相关技术。
Java语言是面向对象的,面向对象技术的基本特征主要有抽象性、封装性、继承性和多态性。
而在本次设计中主要涉与到的是JavaSwing包。
三、JDK平台相关信息
本系统利用JavaJDK作为开发平台,利用它的可视化界面和图形用户界面在硬件环境:
PC兼容机,1G存以与软件环境MicrosoftWindows7操作系统(可以移植到大部分机器上)下一个演示不同的算法,利用Java编写的图形界面演示的动态交换过程。
JDK是Java开发工具包(Javadevelopmentkit))的缩写,是整个Java的核心,是一种用于构建在Java平台上发布的应用程序包括了Java运行环境(JavaRuntimeEnvirement),一堆Java工具和Java基础的类库(rt.jar)。
不论什么Java应用服务器实质都是置了某个版本的JDK。
因此掌握JDK是学好Java的第一步。
最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。
其中IBM的JDK包含的JVM(JavaVirtualMachine)运行效率要比SunJDK包含的JVM高出许多。
而专门运行在x86平台的Jrocket在服务端运行效率也要比SunJDK好很多。
但无论怎么说,我们都要需要先把SunJDK掌握好。
JDK1.1与其以后的版本都支持委托模型。
在委托事件处理模型中,用户操作引发的事件对象仍然传递给相应的组件,但是为了承受事件并进行事件处理,组件必须注册一个事件处理程序,这种事件处理程序称为事件的监听程序(Listener)。
事件的监听程序可以定义在组件所在的类,也可以定义在其他的类里,而对事件的处理,则由组件委托给事件监听所在的类来完成。
第二节Java图形界面技术概述
一、JavaSwing相关概述
在Java中设计图形界面程序时,通常选用AWT组件和Swing组件。
Java的出现带来了抽象窗口工具(AWT),其设计目标是希望构建一个通用的GUI(图形用户界面)使得利用它编程的程序能够运行在所有平台上,以实现SUN你公司的口号“一次编写,随处运行”。
SUN公司推出了新的用户界面库:
Swing,相对AWT来说,Swing功能更强大、使用更方便,它的出现是使得Java的图形用户上了一个台阶[7]。
Swing的关键在于一旦有了顶级容器,则其中所有构件都可以用Java编写,例如,将按钮(utton)放入框架(JFrame)中时,本机操作系统不需要了解该按钮的任何信息,该按钮完全用Java编写且无同级组件,因而组件称为“轻”组件。
Swing具有以下几点优势:
①丰富的组件类型:
Swing提供了非常广泛的标准组件。
这些组件和SWT一样丰富。
基于它良好的可扩展性,除了标准组件,Swing还提供了大量的第三方组件。
许多商业或开源的Swing组件库在开发多年后都已经可以方便地获取了。
②丰富的组件特性:
Swing不仅包含了所有平台上的特性,它还支持根据程序所运行的平台来添加额外特性。
Swing组件特性遵循特定原则,易于扩展,因此能够提供较SWT和AWT更多的功能。
③好的组件API模型支持:
Swing遵循MVC模式,这是一种非常成功的设计模式。
它的API成熟并设计良好。
经过多年的演化,Swing组件APIs变得越来越强大,灵活和可扩展。
它的API设计被认为是最成功的GUIAPI之一。
较之SWT和AWT更面向对象,也更灵活而可扩展。
④标准的GUI库:
Swing和AWT一样是JRE中的标准库。
因此,你不用单独地将它们随你的应用程序一起分发。
它们是平台无关的,不用担心平台兼容性。
⑤成熟稳定:
由于它是纯Java实现的,不会有SWT的兼容性问题。
Swing在每个平台上都有相同的性能,不会有明显的性能差异。
⑥可扩展和灵活性。
Swing完全由Java代码实现。
Swing基于MVC的结构使得它可以发挥Java作为一门面向对象语言的优势。
它提供了许总体上良好的性能。
Swing也有着许多不足之处:
比如Swing比AWT和SWT更多的存消耗。
Swing自己实现了所有组件。
因此,它在运行时装载了大量的类。
而在运行时Java在堆上创建小的对象导致了额外的堆空间消耗。
而许多小的对象难以有效地被垃圾回收机制回收。
因此,Swing应用程序通常会因无法与时回收冗余的对象而导致性能下降。
二、容器和布局
我们都知道,Java的GUI界面定义是由AWT类包和Swing类包来完成的[8]。
它在布局管理上采用了容器和布局管理分离的方案。
也就是说,容器只管将其他组件放入其中,而不管这些组件是如何放置的。
对于布局的管理交给专门的布局管理器类(LayoutManager)来完成。
Java中的容器是用来放置其它组件的一种特殊部件(如标签、按钮、文本框等),用Containers来描述容器,容器组件Window不需要其他组件支撑,独立显示。
容器主要有面板和框架两类,在AWT中,Frame是对应于框架的类,大部分AWT组件在Swing中都有等价的组件,他们在形式上相差一个“J”。
Dialog表示没有菜单条,但是不能改它的变大小。
Pane一定要放在Web浏览器窗口(或者Window组件)中才可以显示。
它是一矩形域,在里面可以摆放其它的组件,也可以有自己的布局管理器。
基本方法是remove(Component
comp)删除指定组件、add(Componentcomp)将指定组件放到容器中、add(Componentcomp,intindex),setLayout(LayoutManager
mgr)设置容器布局。
在Java中还提供了支持用户界面元素自动定位的布局工具。
容器的组件布局,负责确定组件在容器中的位置和大小。
布局管理有流布局管理、边界布局管理和网格布局三种布局管理器。
调用容器的setLayout(布局管理器对象)方法,为容器指定某种布局管理器的一个对象。
当容器需要确定组件大小和定位组件的时候,就会发消息给布局管理器对象,让它完成该项工作。
直接收理组件调用容器setLayout(null)方法,关闭布局管理器。
调用每一个组件的setLocation()方法决定组件位置。
调用每一个组件的setSize()方法决定其大小.直接收理组件将失去平台无关性。
布局管理器种类FlowLayout:
在一行上水平排列组件,直到该行没有足够的空间为止,然后另起一行继续排列当用户缩放容器时,布局管理器将自动进行控制,重新排列。
BorderLayout(边界布局管理器)的布局分为东、南、西、北、中五个位置。
可以把组件放在这五个位置的任意一个,假如没有指定位置,就把中作为默认的位置。
GridLayout(网格布局管理器)在你创建用户界面时,经常像将对象按网格一样均匀排列,例如一行或者一列单项选择按钮,它所确保的所有构件占用的空间完全相同,创网格由应占的行数和列数决定。
网格布局管理器具有更复杂、功能更强的网格布局。
网格布局的每一个组件作为一个卡片,该容器只显示多个卡片中的某一个。
setLayout(newGridLayout(行数,列数));
setLayout(newGridLayout(行数,列数,行间隔,列间隔));
调用容器的方法add()将组件加入容器,组件填入容器的顺序将按照第一行第一个、第一行第二个、……每个网格中都必须填入组件,假如希望是空白的网格,可以给它添加一个空的标签:
add(newLabel())。
三、事件处理
在一个GUI程序中,为了与用户进行交互,需要承受键盘和鼠标的操作。
当用户执行一个用户界面级的操作时,会引发一个事件,通常一个键盘和鼠标操作将引发一个系统事先定义好的事件,用户程序只需要编写代码定义每个事件发生时程序应做何种响应即可[8]。
事件:
说明“发生了什么事情”的对象。
系统根据用户的操作构造出相应事件类的对象。
事件可以分为焦点事件、键盘事件、鼠标事件。
事件源:
有自己的方法,通过它像其注册事件监听器,事件监听器是一个实例。
事件处理程序:
是一个方法,它接收一个事件对象然后分析这个对象最后完成对该事件的处理。
每个事件有一个相应的监听者接口,它规定了能够接收(并处理)该类事件的方法的规。
图2.1界面构成
第三节相关算法的介绍
一、冒泡排序
1、什么是交换
所谓交换,就是根据序列中两个元素关键字的比较结果对换这两个记录在序列中的位置,基于交换排序的算法有很多,本次设计以冒泡排序来为例子,更容易让人们理解交换的概念。
2、冒泡排序的概念
冒泡排序算法的基本思想是:
假设待排序长为n,从后向前或者从前向后两两比较相邻元素的值。
这里我假如是从从小到大排序,若为逆序(即A[i-1]>
A[i]),则交换他们直到序列比较完,我们称他们为一趟冒泡,结果将最小的元素交换到待排元素的序列的第一个位置,下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序列减少一个元素,每趟冒泡的结果把序列中的最小元素放到了序列的最终位置,......,这样最多做n-1趟冒泡排序就把所有元素排好序[9]。
3、冒泡排序的性能分析
冒泡排序的性能分析如下:
空间效率:
仅使用了常数个辅助单元,因而空间复杂度为0
(1)。
时间效率:
当初始序列有序时,比较次数为n-1次,移动次数为0,从而最好情况下的时间复杂度为O(n);
当初始序列为逆序时,需要进行n-1趟排序,第i趟需要进行n-i次关键字的比较,而且每次比较都需要移动三次来交换元素位置。
这种情况下:
元素的比较次数=
=n(n-1)/2
元素的移动次数:
=
=3n(n-1)/2
从而最坏情况下时间复杂度为O(n*n)。
稳定性:
由于当i>
j且A[i].key=A[j].key时不会交换两个元素,从而冒泡排序算法是一个稳定的排序算法。
由此可以总结出冒泡排序的优点是具有稳定性,缺点是慢,每次只能移动相邻的两个数据。
冒泡排序虽然可能不是最好的做法排序[10],但确是经常用的一种排序算法。
二、插入排序
1、什么是插入排序
它的基本思想就是每次将一个待排序的记录,按其关键字大小插入到前面已经排好的子序列中,直到完成了全部记录插入。
由插入排序可以引申出三种重要的排序算法:
直接插入排序、折半插入排序、希尔排序。
在这里主要介绍直接插入排序。
2、直接插入插入排序的概念
直接插入排序是一种简单的排序方法,它的基本操作是将一个记录插入到已经排好的有序表中,从而得到一个新的、记录数增1的有序表。
例如,已知待排序的一组记录的初始序列如下所示:
表2.1排序初始序列
有序序列L[1…i-1]
L(i)
无序序列L[i+1…n]
为了实现将元素L(i)插入到已有序的子序列L[1.......i-1]中我们需要执行以下操作(为避免混淆,下面用”L[]”表示一个表,而L()表示一个元素
排序L(i)在L[1.......i-1中的出入位置k。
将L[k.......i-1]中所有元素后移一个位置。
将L(i)复制到L(k)。
为了实现对L[1...n]的排序,可以将L
(2)到L(n)依前面次插入到前面已经排好的子序列当中,初始假设L[1]是一个已经排好的子序列,上述操作执行n-1次,就能得到一个有序的表插入排序在实现上通常采用的就是就地排序(空间复杂度为O
(1)),因而在从后向前的比较过程中,需要反复把已经排好的元素逐步向后移位,为新元素提供插入空间。
3、直接插入排序的性能分析
直接插入排序的性能分析如下:
在排序过程中,向有序字表中逐个的插入元素的操作进行了n-1趟,每趟操作都分为比较关键字和移动元素,而比较次数和移动次数是取决于排序表初始状态的。
在最好的情况下,表中元素已经有序,此时每插入一个元素,都只需比较移动一次而不用移动元素,因而时间复杂度为O(n)。
在最坏的情况下:
表中序列刚好与排序结果中元素顺序相反(逆序)的的移动次数为0,总的比较次数达到最大,为
,总的移动次数也达到最大,为
。
平均情况下,考虑待排序元素是随机的,此时可以取上述最好与最坏情况的平均值作为平均情况下的时间复杂度,总的比较次数与总的移动次数约为n*n/4。
由此直接插入排序算法的时间复杂度为O(n*n),插入排序往往能表现出很好的性能。
由于每次插入元素时总是从后向前先比较再移动的,所以不会出现相同元素的相对位置发生变化,即直接插入排序算法是一个稳定的排序算法。
适用性:
直接插入排序适用顺序储存和链式储存的线性表。
当为链式储存时可以从前往后排序指定元素的位置,通常的排序算法中,大部分都仅适用于顺序的线性表。
三、选择排序
1、什么是选择排序
选择排序的的基本思想是:
每一趟(例如第i趟)在后面n-i+1(i=1,2,...,n-1)个待排序元素中选择关键字最小的元素,作为有序元素序列的第i个元素,直到第n-1趟做完,待排序元素只剩下一个,就不用选了。
2、简单项选择择排序的概念
假设排序表为L[1...n],第i趟排序即从L[i...n]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个排序表有序。
3、简单项选择择排序的性能分析
简单项选择择排序的性能分析如下:
元素的移动操作很少不会超过3(n-1)次,最好情况下移动次数为0,此时对应的表已经有序;
但元素间比较的次数与元素的初始序列无关,始终是n(n-1)/2;
所以时间复杂度始终是O(n*n)。
稳定性;
在第i趟找到最小元素后,和第i个元素交换,可能会导致第i个元素与其含有相同关键字元素的相对位置发生改变,因此,简单项选择择排序是一个不稳定的排序算法。
四、二叉查找树
1、二叉查找树的定义
二叉查找树(简称BST)也称二叉排序树。
二叉查找树或者是一棵空树;
或者是具有以下性质的二叉树:
(1)若左子树非空,则左子树上所有结点的值均小于它的根结点关键字的值;
(2)若右子树非空,则右子树上所有结点的值均大于它的根结点的关键值值;
(3)左、右子树也分别为二叉查找树;
由此定义可以知,二叉查找树是一个递归的数据结构,可以很方便地使用递归算法对二叉查找树进行各种运算,根据二叉查找树的定义,左子树=<
根节点值=<
右子树节点值,所以,对二叉查找树进行中序遍历,可以得到一个非递减的有序序列。
例如,以下图的二叉树查找的中序遍历的顺序为234579,如图2.2所示:
图2.2一棵二叉树
2、二叉查找树的建立
建立一颗二叉查找树,就是要依顺序输入数据元素,然后将他们插入到二叉查找树适宜的位置的一个过程,其具体的过程,就是在每次输入一个元素的时候,就要建立一个新的结点,如果二叉查找树不是空的,就将新结点的值与根结点,
如果小于根结点的值,就要其插入到左子树种,如果比根结点大,就需要将其插入到右子树中。
如果二叉树为空,就将新结点作为根结点。
3、二叉查找树的插入
二叉树是一种动态的集合,它的特点是树的结点往往不是仅以此就能生成的,而是在通过排序的过程中,当且仅当该关键值不等于树中的时候才插入。
因为二叉查找树是的定义是递归的,那么插入结点的过程是,如果原来的二叉树是空的,就可以把结点直接插入进去,如果不是空的,若关键字的值比根结点小,就将其出入到左子树中,如果比根结点的值大,就要将其插入到右子树中。
4、二叉查找树的删除
当删除一个二叉查找树的结点时,不可以把以该结点的作为根的子树上的结点都删除了,而是必须先把要删除的结点从存储的二叉树的链表上摘下,把因为删除结点而断开的二叉链表,重新连接起来,而且要确保二叉查找树的性质不会改变[13]。
删除操作的过程一般按三种情况来处理的:
假如删除的结点是A是叶结点,就可以直接删了,而不会改变该二叉树的性质。
如果结点A或者是一颗左子树,或者是右子树,就让A的子树成为a父节点的子树,代替A的位置。
如果结点A既有左子树,又有右子树,就令A的直接后继(或者是直接前驱)代替A,然后从二叉排序中删去这个直接后继(或者直接前驱),这样就可以换成前面两种情况了。
5、二叉查找树的性能分析
二叉查找树的高度为H,它的插入和删除操作的运行时间都是O(H),但是在最坏的情况下,即构造二叉查找树的输入序列是有序的,就会形成一个倾斜的
图2.3一般情况的二叉树
图2.4最坏情况下的二叉树
单支树,此时二叉查找树的性能就会明显的变坏,树的高度也增加元素N。
在等概率的条件下,图2.3排序成功的平均排序长度为
ASL=(1+2*2+3*4+4*3)/10=3
而图2.4排序成功的平均排序长度为
ASL=(1+2+3+4+5+6+7+8+9+10)/10=5.5
由此可知,二叉查找树排序算法的平均排序长度,主要取决于树的高度,即与二叉树的形态无关。
从排序过程看,二叉查找树也二分排序相识,就平均时间而言,二叉查找树的排序和二分排序差不多,但二分排序的判定树唯一,而二叉查找树不唯一,相同的关键字,其插入顺序不同可能生成不同的二叉查找树。
就维护表而言,二叉查找树无须移动结点,只需修改指针即可,插入和删除操作,其平均执行时间为0(log2n)。
二分排序的对象是有序顺序表,若有插入和删除结点的操作,则维护表的有序性所花