【java】+排序算法动画演示系统_第1页
【java】+排序算法动画演示系统_第2页
【java】+排序算法动画演示系统_第3页
【java】+排序算法动画演示系统_第4页
【java】+排序算法动画演示系统_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

独创性声明本人郑重声明:所呈交的毕业论文〔设计〕是本人在指导老师指导下取得的研究成果。除了文中特别加以注释和致谢的地方外,论文〔设计〕中不包含其他人已经发表或撰写的研究成果。与本研究成果相关的所有人所做出的任何奉献均已在论文〔设计〕中作了明确的说明并表示了谢意。签名:年月日授权声明本人完全了解****有关保存、使用本科生毕业论文〔设计〕的规定,即:有权保存并向国家有关部门或机构送交毕业论文〔设计〕的复印件和磁盘,允许毕业论文〔设计〕被查阅和借阅。本人授权许昌学院可以将毕业论文〔设计〕的全部或局部内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编论文〔设计〕。本人论文〔设计〕中有原创性数据需要保密的局部为〔如没有,请填写“无〞〕:签名:年月日指导教师签名:年月日摘要 排序在人们的日常生活和学习、科研、生产等各个方面有着重要的应用。因此掌握常用的排序算法是很必要的。本系统采用java2SE为开发工具,实现八种不同排序算法即:快速排序、冒泡排序、堆排序、直接插入排序、希尔排序、直接选择排序、归并排序、基数排序的排序演示。关键词:演示排序代码AbstractOrderinpeople'sdailylivesandlearning,research,productionandotheraspectsofimportantapplications.Sohavethesortingalgorithmusedisverynecessary.Java2SEforthesystemdevelopmenttools,toachieveeightdifferentsortingalgorithmthatis:QuickSort,BubbleSort,HeapSort,InsertionSortdirectlyHilltosort,directselectionsort,mergesorttosorttheorderofthebasepresentation.Keywords:demoSortcode目录正文 11系统概述 11.1工程概述 1工程简介 1工程开发的意义 11.2系统需求描述 1功能需求 11.3系统环境设计 2硬件环境 2软件环境 2系统接口 22系统陈述 32.1系统范围 32.2用例分析 3识别参与者 3识别用例 4构建用例图 3细化用例图 43构建类模型 53.1确定类 5寻找类 5筛选类 5准备数据字典 53.2确定属性 53.4继承分析 63.5构建系统包图 64状态模型 74.1确定状态 74.2构建事件跟踪图 7准备交互式脚本 7确定事件 8事件跟踪图 84.3构建状态图 95交互模型 105.1构建顺序模型 10准备场景 10顺序图 105.2构建活动模型 11确定活动 11活动图 126定义效劳 136.1效劳分析 136.2系统最终类图 147系统实现 147.1系统设计 14优化分析模型 14系统体系结构设计 16用户界面设计 167.2类设计 178系统测试 188.1测试环境 188.2用户界面测试 189系统使用及说明 19结束语 21参考文献 21附录 23谢辞 54排序算法动画演示系统第1章系统概述1.1工程概述工程简介排序在人们的日常生活和学习、科研、生产等各个方面有着重要的应用。因此掌握常用的排序算法是很必要的。此次毕业设计拟开发一个排序算法动画演示系统,以提高对排序算法的掌握程度。本系统实现八种不同排序算法即:快速排序、冒泡排序、堆排序、直接插入排序、希尔排序、直接选择排序、归并排序、基数排序的排序演示。用户可以选择排序算法以演示输入数据在该排序算法下的排序过程。工程开发的意义 随着计算机技术的开展,各种排序算法不断的被提出。排序算法在计算机科学中有非常重要的意义,且应用很广泛。在以后的开展中排序对我们的学习和生活的影响会逐渐增大,很有必要学习排序知识。因此此次毕业设计一方面使自己掌握排序的知识,另一方面锻炼一下独立开发系统的能力。1.2系统需求描述1.2.1 排序算法动画演示系统排序算法动画演示系统快速排序演示排序演示显示代码冒泡排序演示堆排序演示直接插入排序演示希尔排序演示直接选择排序演示归并排序演示基数排序演示输入数据图1.1系统功能图1〕排序算法演示处理 排序算法演示模块能够根据用户选择的排序算法对数据进行排序,动态的显示出排序过程。2〕代码显示 用于显示用户选择的排序算法的代码。1.3系统环境设计硬件环境A.一台奔腾系列微机B.内存要求在512M及其以上C.光栅显示器或液晶显示器或等离子显示器一台软件环境A.Windows2000或WindowsXP及其以上操作系统B.安装有JDK6及其以上开发包系统接口本系统要求有JDK6及其以上开发包就行,所以在实现上不是很复杂不需要什么系统接口。第2章系统陈述2.1系统范围 对于排序算法演示,本系统用用户输入的数据进行各种排序,并显示各排序算法的代码。2.2用例分析识别参与者参与者就是系统在执行的过程中不可缺少的且与系统有交互行为的外部实体、对象或系统。1.用户翻开系统界面进行想要的操作或不进行任何操作。2.用户输入数据。3.用户可以从界面上选择所要进行排序演示。4.系统将数据的排序演示过程和用户所选的排序算法的代码呈现给用户。5.系统退出。经过上述分析,发现系统在执行的过程中只有两个参与者,它们是用户和界面。图2.1显示了这两个参与者。用户用户界面图2.1参与者识别用例用例是系统执行的外部可见的产生对参与者有价值结果的动作序列。基于问题陈述给出以下分析并从中发现系统用例。1.使用者翻开系统界面,输入数据并从中选择排序算法。2.系统显示相应排序演示操作并显示相应排序算法的代码。从上述分析中我们可以初步识别出系统用例:输入数据、选择排序算法、排序演示、显示代码,图2.2给出了这四个用例。选择排序算法选择排序算法排序演示代码输入数据图2.2系统用例2.2.3用户排序算法演示用户排序算法演示用户输入数据输入数据处理数据处理数据图2.3系统用例图〔一〕细化用例图将用例细化可得到分解的用例:将“排序演示〞用例分解为:A:选择排序算法从界面上选择要进行排序的排序算法B:确定数据移动顺序根据选择的排序算法确定数据移动顺序C:演示排序过程显示选择的排序算法对输入数据的排序过程和排序算法代码用户用户界面排序算法演示提供提供显示排序算法代码排序演示选择排序算法输入数据提供图2.4系统用例图〔二〕Extend第3章构建类模型Extend3.1确定类寻找类根据名词识别法从需求陈述中获取如下类与对象:系统界面输入数据数据排序代码排序演示算法演示过程用户代码。筛选类1.无关删除本系统进行特征提取只关心数据、算法、排序代码、算法演示过程等处理过程,其它的都不是本系统关心的。在上面获取的对象中‘系统’和‘用户’和本系统内部处理无关,所以需要删除。2.与实现相关的删除用户输入的数据,并不能作为一个独立的类进行操作,所以需要删除。3.重复删除排序代码和代码在此都表示排序算法代码,所以删除排序代码。4.最终确定的类经过以上几步的筛选且由于功能简单确定为一个类:排序演示。准备数据字典上一步确定了一个类,对这个类进行介绍:排序演示:该类主要是呈现给用户的图像界面,把数据排序的演示过程和排序算法的代码呈现给用户。3.2确定属性属性是对象或类的数值特性及对象或类的性质,借助属性能够对对象和类的结构有更清晰的认识,以下来分析本系统所属类的属性。本系统有一个类:排序演示。根据问题陈述,首先要的把本系统所具有的功能呈现给用户,其次需要用户选择排序算法,把输入的数据按照选择的排序算法得到的排序过程和排序代码显示给用户。具有的属性为排序算法名〔即用户选择的排序算法的名字,由用户按按钮获得〕。所以属性可以说是排序算法选择按钮。其次在演示过程用于对数据进行排序,确定数据移动的顺序,具有的属性为:速度。显示用户选择的排序算法的代码。具有的属性为:排序算法名〔同上〕。所以排序演示类具有的属性为:排序算法选择按钮、速度。经过上述分析给出带有属性的类图:导出导出使用演示过程排序算法名速度图3.2含属性的类图3.4继承分析在本系统中有一个类:排序演示类。所以本系统不存在泛化关系。3.5构建系统包图包是将有着公共主题的一组元素,本系统含有一个类。所以将本系统的类为一个包:排序演示包。图3.3显示了本系统的包图。排序过程排序过程图3.3系统包图图3.4描述了排序演示包的构成。排序演示包构成演示过程演示过程排序算法名速度图3.4演示过程包的构成第4章状态模型4.1确定状态状态是对象的生命周期中的一个条件或状况,在此期间对象将满足某些条件、执行某些活动或等待某些事件。当用户启动本系统的界面时系统开始运行,经过显示排序过程和显示排序算法的代码结束本次处理。在这个过程中具有多个状态,首先用户需要启动界面,接着接受用户输入的数据,接受用户的选择,然后显示排序过程和排序算法的代码,下一次开始或结束。排序演示类有如下状态:开始〔用户启动界面〕,运行状态〔接受用户输入、选择开始处理〕结束状态〔传递处理结果〕。4.2构建事件跟踪图准备交互式脚本脚本是指系统在某一次执行期间出现的一系列事件,即序列事件。每当系统进行一次执行时系统中对象与外界用户交换信息即产生一个事件开始,继而产生一系列事件触发整个过程的执行直到结束。系统一次执行过程中的正常脚本:1.用户启动系统界面2.系统界面要求用户输入待排序的数据3.系统界面接受用户输入的数据4.系统界面要求用户选择排序算法5.系统界面接受用户选择的排序算法,并传递排序算法名进行处理6.系统界面接受处理结果7.系统界面显示演示过程和用户选择的排序算法的代码8.下一次运行或系统退出系统一次执行过程中的异常脚本:1.用户启动系统界面2.系统界面要求用户输入数据3.系统界面要求用户选择排序算法4.系统界面结束用户选择排序算法5.系统界面确认出错,系统内部处理出错6.系统界面取消此次操作7.系统界面请求用户输入数据8.系统界面请求选择排序算法确定事件根据脚本确定如下事件:启动界面、要求输入、要求选择、接受选择、传递排序算法名、接受处理结果、显示演示过程和用户选择的排序算法的代码、等待下一次运行或系统退出等。事件跟踪图从上一节中找出了该系统在一次执行过程中的所发生的事件,和这些事件相关的对象为用户、界面、演示过程、代码等。那么此节的事件跟踪图就是把这些事件和相应的对象清晰的表示出来,竖线代表对象,箭头代表发生的事件。事件跟踪图如图4.1所示:用户用户界面演示过程类果传输结果出入输入图4.1系统事件跟踪图4.3构建状态图下面给出了排序演示类的状态图:接受退出显示处理接受输入图4.2排序演示类的状态图第5章交互模型本章主要用顺序图、活动图来描述交互模型。顺序图显示交互的对象和交互的时间顺序,而活动图显示计算的处理步骤之间的控制流。5.1构建顺序模型顺序建模用于描述对象之间的动态交互关系,着重表达了对象间消息传递的时间顺序。顺序模型包括俩局部:一是场景的准备,二是构建顺序图。准备场景场景包含对象之间的消息以及对象所执行的活动,每条消息把信息从一个对象传递到另一个对象。以下是本系统的一个与实际用户交互的场景:1.某一用户启动系统界面2.系统显示系统界面3.系统等待用户输入数据4.用户输入数据5.系统等待用户选择排序算法6.用户选择排序算法7.系统接受用户选择排序算法8.系统界面把处理结果显示出来,并呈现给用户9.系统等待下一次运行或关闭界面10.用户关闭界面11.系统退出顺序图顺序图描述了对象随时间的推移相互之间交互信息的过程,其中显示的对象沿竖轴排列,而交互的信息沿水平轴按时间的顺序排序。用户用户界面演示过程图5.1系统顺序图5.2构建活动模型确定活动一个活动是一个状态机中进行的非原子的执行单元,活动的执行最终会演化成一系列独立的动作的执行。而每个动作的执行将会改变系统的状态和消息的传递。一个动作可以调用另一个动作,同时也可以发送一个信号。以下是本系统某一次执行过程,可以从中活动系统一次执行过程中的活动。1.用户要求进行排序算法演示并显示排序代码2.用户需要启动系统3.用户输入数据4.用户选择排序算法5.系统对数据进行排序处理6.系统对数据进行移动处理7.系统对排序算法进行显示处理8.系统显示排序演示过程和排序算法的代码9.系统等待下一次运行或此次处理结束,活动终止活动图活动图主要用于描述系统在一次执行过程中各种活动的执行顺序,即描述一个操作中的所要进行的各种活动的执行流程。一个活动图一般包括动作、活动节点、流和对象值。图5.2给出了本系统在一次执行过程的活动图。户结束图5.2系统活动图第6章定义效劳在第三章中的类模型无法完全确定各个类的效劳,而建立的状态模型和交互模型之后,才能最终确定效劳,因为这两个模型确定了系统各类应具有的效劳。6.1效劳分析确定效劳需要从两个方面进行:一是类实体的常规行为,二是系统中特殊需要的行为。1.常规行为直接从类中导出操作,一般类都定义了属性,而每个属性都是可以被访问的,即每个含有属性的类应该定义能够访问该类属性的效劳。排序演示类含有两个属性,定义访问排序算法名和数据移动的速度的效劳。2.从状态模型中导出操作第四章确定了如下事件:要求输入、接受输入、要求选择、接受选择、传递排序算法名、接受处理结果、显示演示过程和排序算法的代码、系统退出。我们可以从中导出如下效劳:选择排序算法、传递排序算法名、显示演示过程和排序算法的代码、系统退出等效劳。3.从交互模型中导出操作顺序图描述了对象之间动态的交互关系,并且描述了这些对象随时间的推移相互之间交互信息的过程。对象之间的交互信息必须启动相应的操作来完成。我们可以从顺序图得出如下效劳:显示界面、输入数据、选择排序算法、传递排序算法名、显示演示过程和排序算法的代码、关闭界面等。我们从活动图中可得到如下操作:输入数据、选择排序算法、对数据进行排序处理、对数据进行移动处理、排序算法进行显示处理、显示排序演示过程、显示排序算法的代码。4.确定效劳从上面得出了两个效劳,因为速度效劳可以用休眠时间控制,经过对得到的效劳进行筛选和合并相同效劳,得出如下最终效劳:获得排序算法名,即获得用户选择的按钮。6.2系统最终类图经过以上分析我们得出了类以及类的属性和操作,下面对各类进行描述和建立含属性、操作的类图。(1)类描述1.排序演示类属性:排序算法选择按钮效劳:获得排序算法名、显示排序演示过程、显示排序算法代码作用:接受用户选择的排序算法名、使数据移动、显示排序演示过程、显示排序算法代码等。(2)最终类图导出导出演示过程排序算法名速度输入数据图6.1最终类图第7章系统实现在分析阶段已经明确系统应该做那些内容,本章系统实现就是把系统应该做的事情转变成系统的实现方案。7.1系统设计优化分析模型本系统的功能就是将用户输入的数据在用户选择的排序算法下的排序过程经过一系列的处理最后将得到的排序演示和排序算法的代码显示给用户。所以可以将本系统划分为四个子系统:输入子系统、选择子系统、处理子系统和显示子系统。输入子系统主要实现待排序数据的输入、选择子系统主要实现排序算法的选择;处理子系统主要是处理数据排序、数据移动处理等;显示子系统主要是把最后得到的排序演示和排序算法的代码显示在界面上。图7.1给出了本系统的子系统之间的关系。统处理子系统显示子系统排序算法演示系统结果输入子系统数据图7.1子系统图输入子系统主要是当用户输入数据时接受数据;选择子系统主要是当用户选择排序算法时接受选择;处理子系统主要使数据的移动和排序算法的代码显示出来;显示子系统将得到的排序演示过程和排序算法的代码显示出来。图7.2给出了系统的架构:户界面处理子系统显示子系统面输入子系统面选择子系统界面图7.2子系统架构图系统体系结构设计本系统经过用户选择排序算法开始执行,只能由用户激发系统开始执行,一次只能处理一种排序算法演示,一次处理完成之后,然后系统将处理的结果反应给用户。由用户和系统交互来支配系统的运行。下列图给出了本系统的交互图:系统系统使用者选择算法排序演示显示代码图7.4系统体系结构图用户界面设计本系统功能简单,没有高复杂性。只要求能够使用户选择排序算法和将最终的排序演示和排序算法的代码显示出来,需要用户操作的只有选择排序算法,之后就可看到结果。本系统只要有供选择排序算法的按钮就行了图7.5系统界面图7.2类设计在分析模型中找出的类有如下特点:〔1〕该类是根据系统所具备的功能得到的比拟理想的类。〔2〕类中的属性和操作也只是实现系统功能的主要的一局部。〔3〕类之间的联系比拟模糊不利于实际中编码。针对这些特点本节继续对分析模型找到的类进行优化以使利于编码。1.对类编码化对分析模型中到的和前一节中增添的类进行程序化。①排序演示类〔SortCartoonDemo〕属性:Button//排序算法按钮名操作:kuaiShuSort()//显示演示过程maoPaoSort() duiSort() zhiJieChaRuSort() shellSort() zhiJieXuanZheSort() guiBingRort() jiShuSort()ScoreTextArea.insert〔string,sp〕//显示排序算法代码2.优化类联系由于本系统只有一个类,所以不存在类联系。3.类描述⑴排序演示类publicclassSortCartoonDemoextendsJFrame{privateJButtonkuaisuButton;//快速排序按钮 privateJButtonmaoPaoButton;//冒泡排序按钮 privateJButtonduiButton;//堆排序按钮 privateJButtonzhiJieChaRuButton;//直接插入排序按钮 privateJButtonshellButton;//希尔排序按钮 privateJButtonzhiJieXuanZheButton;//直接选择排序按钮 privateJButtonguiBingButton;//归并排序按钮 privateJButtonjiShuButton;//基数排序按钮privateTextAreaScoreTextArea;//显示各种排序算法代码的显示框privatevoidkuaiShuSort();privatevoidmaoPaoSort()privatevoidduiSort()privatevoidzhiJieChaRuSort()privatevoidshellSort()privatevoidzhiJieXuanZheSort()privatevoidguiBingSort()privatevoidjiShuSort()}第8章系统测试8.1测试环境软件测试环境:WindowsXP操作系统,编程工具选用JDK6硬件测试环境:内存要求在512M及其以上奔腾系列机8.2用户界面测试用户界面是用户和系统的接口,一个好的用户界面不仅要求能够方便用户使用而且美观。所以用户界面测试的主要任务是测试用户界面是否友好,界面上的各个控件是否好用。启动应用程序,选择一个排序算法对界面进行测试,测试发现界面未发现不友好现象。8.1系统测试图〔一〕第9章系统使用及说明本系统使用说明如下:1.启动应用程序,会出现如下系统界面9.1系统说明图〔一〕2.按下八个排序算法按钮中的一个。9.2系统说明图〔二〕3.显示数据在该排序算法下的排序演示和该排序算法的代码。9.3系统说明图〔三〕4.关闭窗口9.4系统说明图〔四〕结束语排序算法是计算机科学中一个重要的局部,掌握好它对以后的学习有很大的帮助。大学期间只学习了几种根本的排序算法,还有更多的排序算法需要学习。通过此次毕业设计,第一使我进一步学习了排序算法。了解到排序算法应用广泛。及排序技术在现实生活中的重要性。第二使我感到自己知识的缺乏,Java中有很多东西,自己只略懂皮毛,尤其对于线程方面的知识很缺乏。还有就是发现软件工程学得很差,很多地方感到无从下手。第三使我意识到做事情要认真,要坚持。由于疏忽和马虎浪费了很多时间。开始做的时候遇到了一些困难,我放弃了,中间有好长一段时间没理它。如果坚持一下,可能很快就会解决。最后我要感谢我的指导老师,在做毕业设计的过程中不仅给我提供了珍贵的资料和还给我提供了很多指导和建议,使我能够顺利的完成毕业设计。参考文献[1]朱战立.数据结构使用C语言[M].〔第三版〕.西安:西安交通大学出版社,2004.234-257[2]BruceEckel.Java编程思想[M].〔第四版〕.北京:机械工业出版社,2007.6.669-672[3]IanSommerville.软件工程[M].[4]王克宏、董丽、朱家维.Java技术及其应用[M].〔第一版〕.北京:高等教育出版社,1999.125-138[5]张海藩.软件工程导论[M].〔第三版〕.北京:清华大学出版社,1998.38-41[6]MarkAllenWeiss.数据结构与算法分析[M].〔第二版〕 .北京:机械工业出版社,2021.3.183-195[7]张曜、张青、郭立山.Java程序设计教程[M].〔第一版〕.北京:清华大学出版社,2002.11.38-41[8]JamesCohoon、JacketDavidson.Java程序设计[M].〔第一版〕.北京:清华大学出版社[9]HerbertSchildtJava实用教程[M].〔第四版〕.北京:清华大学出版社[10]宋雨、赵文清.软件工程[M].〔第一版〕.北京:中国电力出版社,2007.182-198附录代码清单

packageSortCartoonDemo;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassSortCartoonDemo007extendsJFrame{ privatePanelpanel; privateJLabel[]n; privateJLabel[]ppnumber; privateJTextFieldinputField; privateJTextFieldchoice; privateJLabelselect; privateJButtonkuaisuButton;//快速排序按钮 privateJButtonmaoPaoButton;//冒泡排序按钮 privateJButtonduiButton;//堆排序按钮 privateJButtonzhiJieChaRuButton;//直接插入排序按钮 privateJButtonshellButton;//希尔排序按钮 privateJButtonzhiJieXuanZheButton;//直接选择排序按钮 privateJButtonguiBingButton;//归并排序按钮 privateJButtonjiShuButton;//基数排序按钮 privateTextAreaScoreTextArea;//显示各种排序算法代码的显示框 publicSortCartoonDemo007(){ Containercontainer=getContentPane(); container.setLayout(null); panel=newPanel(); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(900,700); this.setLocationRelativeTo(null); this.setResizable(false); this.setAlwaysOnTop(true); JLabell=newJLabel("输入12个数据,只能输入2组:"); select=newJLabel("选择一种排序方法"); kuaisuButton=newJButton("1快速排序"); maoPaoButton=newJButton("2冒泡排序"); duiButton=newJButton("3堆排序"); zhiJieChaRuButton=newJButton("4直接插入排序"); shellButton=newJButton("5希尔排序"); zhiJieXuanZheButton=newJButton("6直接选择排序"); guiBingButton=newJButton("7归并排序"); jiShuButton=newJButton("8基数排序"); ScoreTextArea=newTextArea(); ScoreTextArea.setBounds(300,150,680,500); //各种排序算法代码: finalStringkuaisuString="//快速排序"+"\n"+ "voidQuickSort(DataTypea[],intlow,inthigh)"+"\n"+ "//用递归方法对数据元素a[low]--a[high]进行快速排序"+"\n"+ "{"+"\n"+ "inti=low,j=high;"+"\n"+ "DataTypetemp=a[low];//取第一个元素为标准数据元素"+"\n"+ "while(i<j)"+"\n"+ "{"+"\n"+ "while(i<j&&temp.key<=a[j].key)j--;//在数组的右端扫描"+"\n"+ "if(i<j)"+"\n"+ "{"+"\n"+ "a[i]=a[j];"+"\n"+ " i++;"+"\n"+ "}"+"\n"+ "while(i<j&&a[i].key<temp.key)i++;//在数组的左端扫描"+"\n"+ "if(i<j)"+"\n"+ "{"+"\n"+ "a[j]=a[i];"+"\n"+ " j--;"+"\n"+ "}"+"\n"+ "}"+"\n"+ "a[i]=temp;"+"\n"+ "if(low<i)QuickSort(a,low,i-1);//对左端子集合进行递归"+"\n"+ "if(j<high)QuickSort(a,j+1,high);//对右端子集合进行递归"+"\n"+ "}"; finalStringmaoPaoString="//冒泡排序"+"\n"+ "voidBubbleSort(DataTypea[],intn)"+"\n"+ "{ "+"\n"+ " inti,j,flag=1;"+"\n"+ " DataTypetemp;"+"\n"+ " for(i=1;i<n&&flag==1;i++)"+"\n"+ " {"+"\n"+ " flag=0;"+"\n"+ " for(j=0;j<n-i;j++)//j<n-i控制内部循环次数"+"\n"+ " {"+"\n"+ " if(a[j].key>a[j+1].key)"+"\n"+ " {"+"\n"+ " flag=1;//交换那么flag=1"+"\n"+ " temp=a[j];"+"\n"+ " a[j]=a[j+1];"+"\n"+ " a[j+1]=temp;"+"\n"+ " }"+"\n"+ " }"+"\n"+ " }"+"\n"+ "}"; finalStringduiString="voidCreatHeap(DataTypea[],intn,inth)//创立堆"+"\n"+ "{"+"\n"+ " inti,j,flag;"+"\n"+ " DataTypetemp;"+"\n"+ " i=h;//i为要建堆的二叉树根结点下标"+"\n"+ " j=2*i+1;//j为i的左孩子结点的下标"+"\n"+ " temp=a[i];"+"\n"+ " flag=0;"+"\n"+ " while(j<n&&flag!=1)//沿左右孩子中值较大者重复向下筛选"+"\n"+ " {"+"\n"+ " if(j<n-1&&a[j].key<a[j+1].key)j++;//寻找左右孩子结点中的较大者,j为其下标"+"\n"+ " if(temp.key>a[j].key)//a[i].key>a[j].key"+"\n"+ " flag=1;//标记结束筛选条件"+"\n"+ " else{//否那么把a[j]上移"+"\n"+ " a[i]=a[j];"+"\n"+ " i=j;"+"\n"+ " j=2*i+1;"+"\n"+ " }"+"\n"+ " }"+"\n"+ " a[i]=temp;//把最初的a[i]赋予最后的a[j]"+"\n"+ "}"+"\n"+ "\n"+ "//初始化创立最大堆"+"\n"+ "voidInitCreatHeap(DataTypea[],intn)"+"\n"+ "{"+"\n"+ " inti;"+"\n"+ " for(i=(n-1)/2;i>=0;i--)"+"\n"+ " CreatHeap(a,n,i);"+"\n"+ "}"+"\n"+ "\n"+ "//堆排序"+"\n"+ "voidHeapSort(DataTypea[],intn)"+"\n"+ "{"+"\n"+ " inti;"+"\n"+ " DataTypetemp;"+"\n"+ " InitCreatHeap(a,n);//初始化创立最大堆"+"\n"+ "for(i=n-1;i>0;i--)//当前最大堆个数每次递减1"+"\n"+ " { //把堆顶a[0]元素与当前最大堆的最后一个元素交换"+"\n"+ " temp=a[0];"+"\n"+ " a[0]=a[i];"+"\n"+ " a[i]=temp;"+"\n"+ " CreatHeap(a,i,0);//调整根结点满足最大堆"+"\n"+ " }"+"\n"+ "}"; finalStringzhiJieChaRuString="//直接插入排序"+"\n"+ "voidInsertSort(DataTypea[],intn)"+"\n"+ "{"+"\n"+ "inti,j;"+"\n"+ "DataTypetemp;"+"\n"+ "for(i=0;i<n-1;i++)"+"\n"+ " {"+"\n"+ " temp=a[i+1];"+"\n"+ " j=i;"+"\n"+ " while(j>-1&&temp.key<a[j].key)"+"\n"+ " {"+"\n"+ " a[j+1]=a[j];"+"\n"+ " j--;"+"\n"+ " }"+"\n"+ " a[j+1]=temp;"+"\n"+ " }"+"\n"+ "}"; finalStringshellString="//希尔排序"+"\n"+ "voidShellSort(DataTypea[],intn,intd[],intnumOfD)"+"\n"+ "//对元素a[0]--a[n-1]排序,d[0]--d[numOfD-1]为希尔增量值."+"\n"+ "{"+"\n"+ "inti,j,k,m,span;"+"\n"+ "DataTypetemp;"+"\n"+ "for(m=0;m<numOfD;m++)//共numOfD次循环"+"\n"+ "{"+"\n"+ " span=d[m];//取本次的增量值"+"\n"+ " for(k=0;k<span;k++)//共span个小组"+"\n"+ " {//组内是直接插入排序,区别是每次不是增1而是增span."+"\n"+" for(i=k;i<n-span;i=i+span)"+"\n"+ " {"+"\n"+ " temp=a[i+span];"+"\n"+ " j=i;"+"\n"+ " while(j>-1&&temp.key<=a[j].key)"+"\n"+ " {"+"\n"+ " a[j+span]=a[j];"+"\n"+ " j=j-span;"+"\n"+ " }"+"\n"+ " a[j+span]=temp;"+"\n"+ " }"+"\n"+ " }"+"\n"+ "}"+"\n"+ "}"; finalStringzhiJieXuanZheString="//直接选择排序"+"\n"+ "voidSelectSort(DataTypea[],intn)"+"\n"+ "{"+"\n"+ "inti,j,small;"+"\n"+ "DataTypetemp;"+"\n"+ "for(i=0;i<n-1;i++)"+"\n"+ "{"+"\n"+ " small=i;//设第i个数据元素关键字最小"+"\n"+ " for(j=i+1;j<n;j++)//寻找关键字最小的数据元素"+"\n"+ " {"+"\n"+ " if(a[j].key<a[small].key)small=j;//记住最小元素的下标"+"\n"+ " if(small!=i)//当最小元素的下标不为i时交换位置"+"\n"+ " {"+"\n"+ " temp=a[j];"+"\n"+ " a[i]=a[small];"+"\n"+ " a[small]=temp;"+"\n"+ " }"+"\n"+ " }"+"\n"+ "}"+"\n"+ "}"; finalStringbingGuiString="voidMerge(DataTypea[],intn,DataTypeswap[],intk)//一次二路归并排序"+"\n"+ "//k为有序子数组的长度,一次二路归并排序后的有序子序列存于数组swap中."+"\n"+ "{"+"\n"+ " intm=0,u1,L2,i,j,u2;"+"\n"+ " intL1=0;//第一个有序子数组下界为0."+"\n"+ " while(L1+k<=n-1)"+"\n"+ " {"+"\n"+ " L2=L1+k;//计算第二个有序在数组下界."+"\n"+ " u1=L2-1;//计算第一个有序在数组上界."+"\n"+ " u2=(L2+k-1<=n-1)?L2+k-1:n-1;//计算第二个有序在数组上界."+"\n"+ " for(i=L1,j=L2;i<=u1&&j<=u2;m++)//两个有序子数组合并."+"\n"+ " {"+"\n"+ " if(a[i].key<=a[j].key)"+"\n"+ " {"+"\n"+ " swap[m]=a[i];"+"\n"+ " i++;"+"\n"+ " }"+"\n"+ " else{"+"\n"+ " swap[m]=a[j];"+"\n"+ " j++;"+"\n"+ " }"+"\n"+ " }"+"\n"+"//子数组2已归并完,将子数组1中剩余的元素存放到数组swap中."+"\n"+ " while(i<=u1)"+"\n"+ " {"+"\n"+ " swap[m]=a[i];"+"\n"+ " m++;"+"\n"+ " i++;"+"\n"+ " }"+"\n"+"//子数组1已归并完,将子数组2中剩余的元素存放到数组swap中."+"\n"+ " while(j<=u2)"+"\n"+ " {"+"\n"+ " swap[m]=a[j];"+"\n"+ " m++;"+"\n"+ " j++;"+"\n"+ " }"+"\n"+ " L1=u2+1;"+"\n"+ " }"+"\n"+" //将原始数组中只够一组的数据元素顺序存放到数组swap中."+"\n"+ " for(i=L1;i<n;i++,m++)swap[m]=a[i];"+"\n"+ "}"+"\n"+ "\n"+ "//二路归并排序"+"\n"+ "voidMergesort(DataTypea[],intn)"+"\n"+ "{"+"\n"+ "inti,k=1;//归并长度从1开始."+"\n"+ "DataTypeswap[]=newDataType[n];//swap为动态数组.!!!!!!!!!!!!!!!!!!"+"\n"+ "while(k<n)"+"\n"+ "{"+ " Merge(a,n,swap,k);//调用归并函数Merge(a,n,swap,k)"+"\n"+ " for(i=0;i<n;i++)"+"\n"+ " a[i]=swap[i];//将元素从临时数组swap放回数组a中."+"\n"+ " k=2*k;//归并长度加倍"+"\n"+ " }"+"\n"+ "}"; finalStringjiShuString="//基数排序:"+"\n"+ "#include<stdio.h>"+"\n"+ "#include<stdlib.h>"+"\n"+ "intmain(void)"+"\n"+ "{"+"\n"+ " intdata[10]={614,738,921,485,637,101,215,530,790,306};"+"\n"+//1,34,04,68,00,84,42,13,06,26 " inttemp[10][10]={0};"+"\n"+ " intorder[10]={0};"+"\n"+ " inti,j,k,n,lsd;"+"\n"+ " k=0;n=1;"+"\n"+ " while(n<=10)"+"\n"+ " {"+"\n"+ " for(i=0;i<10;i++)"+"\n"+ " {"+"\n"+ " lsd=((data[i]/n)%10);"+"\n"+ " temp[lsd][order[lsd]]=data[i];"+"\n"+ " order[lsd]++;"+"\n"+ " }"+"\n"+ " for(i=0;i<10;i++)"+"\n"+ " {"+"\n"+ " if(order[i]!=0)"+"\n"+ " for(j=0;j<order[i];j++)"+"\n"+ " {"+"\n"+ " data[k]=temp[i][j];"+"\n"+ " k++;"+"\n"+ " }"+"\n"+ " order[i]=0;"+"\n"+ " }"+"\n"+ " n*=10;"+"\n"+ " k=0;"+"\n"+ " }"+"\n"+ " return0;"+"\n"+ "}"; l.setBounds(10,18,180,20); add(l); inputField=newJTextField("614,738,921,485,637,101,215,530,790,306,354,891");//初始化待排序的数据。 inputField.setBounds(180,18,420,40); add(inputField); select.setBounds(20,130,150,30); add(select); kuaisuButton.setBounds(90,160,150,30); add(kuaisuButton); maoPaoButton.setBounds(90,200,150,30); add(maoPaoButton); duiButton.setBounds(90,240,150,30); add(duiButton); zhiJieChaRuButton.setBounds(90,280,150,30); add(zhiJieChaRuButton); shellButton.setBounds(90,320,150,30); add(shellButton); zhiJieXuanZheButton.setBounds(90,360,150,30); add(zhiJieXuanZheButton); guiBingButton.setBounds(90,400,150,30); add(guiBingButton); jiShuButton.setBounds(90,440,150,30); add(jiShuButton); choice=newJTextField(); setTitle("排序动画演示"); //快速排序按钮事件处理 kuaisuButton.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ ScoreTextArea.insert(kuaisuString,0); add(ScoreTextArea); kuaiShuSort();}}); //冒泡排序按钮事件处理 maoPaoButton.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ ScoreTextArea.insert(maoPaoString,0); add(ScoreTextArea); maoPaoSort();}}); //堆排序按钮事件处理 duiButton.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ ScoreTextArea.insert(duiString,0); add(ScoreTextArea); duiSort();}}); //直接插入排序按钮事件处理 zhiJieChaRuButton.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ ScoreTextArea.insert(zhiJieChaRuString,0); add(ScoreTextArea); zhiJieChaRuSort();}}); //希尔选择排序按钮事件处理 shellButton.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ ScoreTextArea.insert(shellString,0); add(ScoreTextArea); shellSort();}}); //直接选择排序按钮事件处理 zhiJieXuanZheButton.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ ScoreTextArea.insert(zhiJieXuanZheString,0); add(ScoreTextArea); zhiJieXuanZheSort();}}); //并归排序按钮事件处理 guiBingButton.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ ScoreTextArea.insert(bingGuiString,0); add(ScoreTextArea); guiBingSort();}}); //基数排序按钮事件处理 jiShuButton.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ ScoreTextArea.insert(jiShuString,0); add(ScoreTextArea); jiShuSort();}}); //设置待排序数据的属性。 n=newJLabel[12]; ppnumber=newJLabel[n.length]; for(inti=0;i<n.length;i++){ n[i]=newJLabel(); n[i].setFont(newFont("",Font.BOLD,14)); n[i].setForeground(Color.gray); n[i].setHorizontalAlignment(JLabel.CENTER); add(n[i]); } for(inti=0;i<n.length;i++){ ppnumber[i]=newJLabel(); ppnumber[i].setFont(newFont("",Font.BOLD,14)); ppnumber[i].setForeground(Color.gray); ppnumber[i].setHorizontalAlignment(JLabel.CENTER); add(ppnumber[i]); } container.add(panel); setResizable(false);//设置此窗体不可由用户调整大小 setVisible(true); } //快速排序移动: privatevoidkuaiShuSort(){ try{ Stringsrc=inputField.getText(); src=src.replaceAll("[^0-9,]",""); String[]sp=src.split(","); finalint[]v=newint[sp.length]; intleft=0,w=40,offx=0,offy=95; for(inti=0;i<n.length;i++)n[i].setText(null); for(inti=0;i<sp.length;i++){ n[i].setText(sp[i]); v[i]=Integer.valueOf(sp[i]); n[i].setSize(w,20); n[i].setLocation((left+=w)+offx,offy); } newThread(){ publicvoidrun(){ kuaisuButton.setEnabled(false); s(500); try{ QuickSort(n,0,n.length-1); }catch(Exceptione){} kuaisuButton.setEnabled(true); } voidQuickSort(JLabel[]a,intlow,inthigh){ inti=low,j=high; JLabelL=a[low]; while(i<j){ while(i<j&&v[low]<=v[j]) j--; if(i<j){ i-=i==0?1:2; i++; } while(i<j&&v[i]<v[j]) i++; if(i<j){ JLabelLL=a[i]; a[i]=a[j]; a[j]=LL; a[i].setForeground(Color.blue); for(intk=0;k<7;k++){ a[i].setVisible(k%2==0); s(123); } swap(a[i],a[j]); a[i].setForeground(Color.gray); v[i]+=v[j]; v[j]=v[i]-v[j]; v[i]-=v[j]; j--; } } a[i]=L; i-=i==0?1:2; if(low<i) QuickSort(a,low,i-1); if(j<high) QuickSort(a,j+1,high); } privatevoidsort2(){thrownewUnsupportedOperationException("Notyetimplemented");}privatevoidswap(JLabela,JLabelb){ JLabelt=a; a=b; b=t; Pointpa=a.getLocation(); Pointpb=b.getLocation(); intx1,x2,y1,y2; x1=pa.x; x2=pb.x; y1=pa.y; y2=pb.y; intdelay=10; while(x1<(x1+x2)/2){ a.setLocation(++x1,y1++); b.setLocation(--x2,y2--); s(delay); } while(x1<pb.x){ a.setLocation(++x1,y1--); b.setLocation(--x2,y2++); s(delay); } a.setLocation(pb); b.setLocation(pa);}privatevoids(inti){ try{ sleep(i); }catch(Exceptione){}} }.start(); }catch(Exceptione){e.printStackTrace();setTitle("请检查输入的数据,只能输入2组!");} } //冒泡排序移动: privatevoidmaoPaoSort(){ try{ Stringsrc=inputField.getText(); src=src.replaceAll("[^0-9,]",""); String[]sp=src.split(","); finalint[]v=newint[sp.length]; intleft=0,w=40,offx=0,offy=95; for(inti=0;i<n.length;i++)n[i].setText(null); for(inti=0;i<sp.length;i++){ n[i].setText(sp[i]); v[i]=Integer.valueOf(sp[i]); n[i].setSize(w,20); n[i].setLocation((left+=w)+offx,offy); } newThread(){ publicvoidrun(){ maoPaoButton.setEnabled(false); s(500); try{ intflag=1; for(inti=1;i<n.length&&flag==1;i++){ flag=0; for(intj=0;j<n.length-i;j++){ if(v[j]>v[j+1]){ flag=1; JLabell=n[j]; n[j]=n[j+1]; n[j+1]=l; n[j].setForeground(Color.blue); for(intk=0;k<7;k++){ n[j].setVisible(k%2==0); s(123); } swap(n[j],n[j+1]); n[j].setForeground(Color.gray); v[j]+=v[j+1]; v[j+1]=v[j]-v[j+1]; v[j]-=v[j+1]; j-=j==0?1:0; } } } }catch(Exceptione){} maoPaoButton.setEnabled(true); } privatevoidsort2(){ thrownewUnsupportedOperationException("Notyetimplemented"); } privatevoidswap(JLabela,JLabelb){ JLabelt=a; a=b; b=t; Pointpa=a.getLocation(); Pointpb=b.getLocation(); intx1,x2,y1,y2; x1=pa.x; x2=pb.x; y1=pa.y; y2=pb.y; intdelay=10; while(x1<(x1+x2)/2){ a.setLocation(++x1,y1++); b.setLocation(--x2,y2--); s(delay); } while(x1<pb.x){ a.setLocation(++x1,y1--); b.setLocation(--x2,y2++); s(delay); } a.setLocation(pb); b.setLocation(pa); } privatevoids(inti){ try{ sleep(i); }catch(Exceptione){} } }.start(); }catch(Exceptione){e.printStackTrace();setTitle("请检查输入的数据,只能输入2组!");} }

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论