陕西理工学院毕业设计
的运行环境是用ANSIC实现的。
[10]
Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
[10]
Java是性能略高的。与那些解释型的高级脚本语言相比,Java的性能还是较优的。
[10]
Java语言是原生支持多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
[10]
Java语言是动态的。Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
Java语言的优良特性使得Java应用具有无比的健壮性和可靠性, 这也减少了应用系统的维护费用。Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。Java的编译一次,到处 可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。特别是Java企业应用编程接口(Java Enterprise APIs)为企业计算及电子商务应用系统提供了有关技术和丰富的类库。
(2) JDK运行环境
[8]
JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。
没有JDK的话,无法编译Java程序,如果想只运行Java程序,要确保已安装相应的JRE。JDK包含的基本组件包括:
javac – 编译器,将源程序转成字节码。
jar – 打包工具,将相关的类文件打包成一个文件。 javadoc – 文档生成器,从源码注释中提取文档。 jdb – debugger,查错工具。
java – 运行编译后的java程序(.class后缀的)。
appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。 Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。 Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。 Jconsole: Java进行系统调试和监控的工具。 (3) MyEclipse开发工具
MyEclipse企业级工作平台(MyEclipseEnterprise Workbench ,简称MyEclipse)是对EclipseIDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML,Struts,JSP,CSS,Javascript,Spring,SQL,Hibernate。MyEclipse 是一个十分优秀的用于开发Java, J2EE的 Eclipse 插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错。MyEclipse目前支持Java Servlet,AJAX, JSP, JSF, Struts,Spring, Hibernate,EJB3,JDBC数据库链接工具等多项功能。可以说MyEclipse是几乎囊括了目前所有主流开源产品的专属eclipse开发 工具。根据官方最新消息,MyEclipse 2013
第 3 页 共 80 页
陕西理工学院毕业设计
已经正式发布!MyEclipse 2013[2]支持HTML5、JQuery和主流的Javascript 库。随着MyEclipse 2013支持Html5,你可以添加音频、视频和API元素到你的项目,从而为移动设备创建复杂的Web应用程序。你甚至还可以通过HTML5 可视化设计器设计令人难以置信的用户界面。同时,随着MyEclipse 2013支持JQuery,你可以通过插件提升性能,并添加动画效果到设计中。
第 4 页 共 80 页
陕西理工学院毕业设计
2排序算法
2.1直接插入排序
(1) 基本原理
假设待排序的n个记录{L0,L1,?,Ln}顺序存放在数组中,直接插入法在插入记录Li(i=1,2,?,n-1)时,记录被划分为两个区间[L0,Li-1]和[Li+1,Ln-1],其中,前一个子区间已经排好序,后一个子区间是当前未排序的部分,将关键码Ki与Ki-1Ki-2,?,K0依次比较,找出应该插入的位置,将记录Li插,然后将剩下的i-1个元素按关键词大小依次插入该有序序列,没插入一个元素后依然保持该序列有序,经过i-1趟排序后即成为有序序列。每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止,为了在查找插
[1]
入位置的过程中避免数组下标出界,在l[0]处设置监视哨。排序示例见图2.1。
图2.1 直接插入排序示例
(2) 算法描述
对字符串顺序链表src作直接插入排序,返回值为空。 public void insertSort(String[] src) { for (int i = 2; i < src.length; i++) { if (src[i].compareTo(src[i - 1]) < 0) { src[0] = src[i]; src[i] = src[i - 1]; int j = i - 2; for (; src[0].compareTo(src[j]) < 0; j--) { src[j + 1] = src[j]; } src[j + 1] = src[0]; } } }
(3) 时间复杂度分析
第 5 页 共 80 页
陕西理工学院毕业设计
直接插入排序算法必须进行n-1趟。最好情况下,即初始序列有序,执行n-1趟,但每一趟只比较一次,移动元素两次,总的比较次数是(n-1),移动元素次数是2(n-1)。因此最好情况下的时间复杂度就是O(n)。最坏情况(非递增)下,最多比较i次,因此需要的比较次数是:所以,时间复
2
杂度为O(n)。 2.2折半插入排序
(1) 基本思想
是对直接插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度[2]。
(2) 算法描述
对字符串顺序链表src作折半插入排序,返回值为空。 public void binaryInsertionSort(String[] src) { for (int i = 2; i < src.length; i++) { // 将src[i]暂存在src[0] src[0] = src[i]; int low = 1, high = i - 1; while (low <= high) { int m = (low + high) / 2; if (src[0].compareTo(src[m]) < 0) {// high = m - 1; } else { low = m + 1; } } // 记录后移 for (int j = i - 1; j >= high + 1; j--) { src[j + 1] = src[j]; } // 插入 src[high + 1] = src[0]; } }
(3)时间空间复杂度
折半插入排序算法是一种稳定的排序算法,比直接插入算法明显减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为O(n^2),与直接插入排序算法相同。附加空间O(1); 2.3快速排序
(1) 基本原理
对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小则可分别对两部分记录继续进行排序,以达到整个序列有序。假设待排序的序列为{ K.r[s],K.r[s+1],...,K.r[t]},首先任意选取一个记录(通常选第一个)作为支点,然后按下述原则重新排列其余记录:将所有关键字比它小的记录都安置在它的位置之前,将所有关键字较它打的记录都安置在它的位置之后。由此可以将位置i作分界线,将序列{ K.r[s],K.r[s+1],...,K.r[t]}分割成两个子序列{ K.r[s],K.r[s+1],...,K.r[i-1]}和
[11]
{ K.r[i+1],K.r[s+1],...,K.r[t]}。这个过程称一趟快速排序。排序示例见图2.2。
第 6 页 共 80 页
陕西理工学院毕业设计
图2.2 快速排序示例
(2) 算法描述
交换顺序表L中子表l[low...high]的记录,枢轴记录到位,并返回其所在位置,此时在它之前(后)的记录均不大(小)于它。
public int partition(String[] l,int low,int high) { //用字表的第一个记录轴的记录 l[0] = l[low]; //轴记录关键字 String pivotkey = l[low]; //从表的两端交替向中间扫描 while(low < high) { //将比轴记录小的记录移到低端 while(low < high && l[high].compareTo(pivotkey) >= 0) { --high; } //将比轴记录大的记录移到高端 l[low] = l[high]; while(low 第 7 页 共 80 页