用JAVA语言改进插入排序算法
来源:99网
维普资讯 http://www.cqvip.com 84 第12期NO.12 宜宾学院学报Journal of Yibin University 用JAVA语言改进插人排序算法 季忠苑 (浙江丽水学院计算机系,浙江丽水323000) 摘要:在很多排序操作中,我们都套用剐插入排序算-击。为了提高插入排序算_击的性能,文章着重介绍了用JAvA语言编写的改进后的插入排序算 关键词:JAVA;插入排序;快速排序 中圈分类号:TP312 文献标识码:A 文章编号:1671—5365(2006)12-0084—02 0引言 if(A[i].compareTo(Sentinel—vlaue)(O) 很多算法都涉及查找操作,往往查找需要进行两类不同的 Sentinel—vlaue=A[Sentinel—postion=I]. 测试:一类用于测试是否找到待查找元素,另一类测试则用于判 插入排序往往用于快速排序的最后阶段。若是这样的话,插 断查找是否还在指定的数据结构范围内。实际上,这两类测试可 人排序可用于部分有序的数组中,并且我们可知“监视哨”必将 通过所谓的“监视哨”合二为一的。特别是,“监视哨”可用于插 在数组的最小的K个元素中(这里的K是某个依赖实现的常数, 人排序算法中,以使算法的执行效率更高,甚至还能使循环内的 典型的是16左右的数,往往要远小于A.1entgh的值(也就是数 比较次数减少一半。因为“监视哨”对于插入排序来说,它是一 组的长度)。作为快速排序的使用,代码还需要重写以便与实际 个内部元素,所以在线性时间内就可找到并插入到指定位置上, 相符,使第一步所花费的时间可大大改善(时间复杂度为0(A. 并且这个操作在整个算法中仅仅需要做一次。 1ength/K))。 基于这种思想,本文给出了对一个给定的数组进行升序排 1.2在指定的位置插入“监视哨” 序的JAVA代码。代码所涉及的算法对于稳定和不稳定排序均 基于稳定或不稳定排序的不同需要,对应的设置“监视哨” 适用。当然,不稳定排序要更高效些。 有两种不同的方法。 ・ 改进后的插人排序算法对数组A排序分三步:查找“监视 对于更高效的不稳定排序(在待排序的记录中若有多个相 哨”,插人到指定的数组位置上(在A[O]处);最后对数组A的剩 同的关键字,在用某种方法排序之后,这些关键字相同的记录相 余元素进行高效率的插入排序。值得注意的是:在JAVA中数组 对先后次序会发生变化的)设置“监视哨”可用以下两条语句实 A的下标是从0到A.1ength一1间变化的。尽管利用该算法可对 现: 整型或一些其它简单类型的数组进行直接有效的排序,但这里 //不稳定排序 为了使算法更通用,我们借助了JAVA的Comparable接口:也就 A[eSntinel—postion]=A[0]; 是说,算法可对任何支持Comparable接口的类进行排序。 A[0]=Sentine1.value; 1算法实现 对于稳定排序(在待排序的记录中若有多个相同的关键字, 算法的具体步骤如下: 在用某种方法排序之后,这些关键字相同的记录相对先后次序 1.1获取“监视哨”的位置和大小 不变的),我们可通过先对所有数组下标介于0到Sentinel—pos・ //Sentinel—position,Sentinel—value分别为“监视哨”的位置和 tion一1的数组元素后移一位,而后把“监视哨”放在A[0]上: 值变量。 //稳定排序 int eSntinel—position=0; f0r(inl i—Sentinel position;i>O;i一一) Comparable Sentinel—value=A[Sentinel—position]; A[i]=A[i一1]; f0r(inl i=1;i<a.1ength;i++) A[0]=Sentinel—value; 收稿日期:2006~08—22 作者简介:季忠苑(1975一)、男,软件设计师,讲师,主要从事软件工程研究 维普资讯 http://www.cqvip.com 2006年12月 季忠苑:用jAVA语言改进插入排序算法 85 1.3剩余数组元素的插入排序 } 到目前为止,A[O]就是数组A的最小元素(即“监视哨”), 那么算法的下一步: 插入算法本身,就可以:(1)避免内层循环中的边界检验,因 } A[j]=V; 2总结 为指定的待插入值V肯定在给定的范围内的;(2)外层循环也可 通过引入“监视哨”,优化了传统的插入排序算法,使比较次 从而提高了整个算法的时间效率。 从-_2开始,因为A[O]是值最小的元素,那么A[0]一定小于A 数大大的减少,[1],也就是说A[0],A[1]已经按要求排好序了。 最后一步操作是稳定的操作,整个算法的稳定性取决于第 二步。 f0r(jnt j=2;i<A.1ength;i++) {intj=i; Comparable V=A[_i]; while(A[j-1].compareTo(V)>O) {A[j]=A[j_1]; ;一一: 参考文献: [1)严蔚敏,等.数据结构[M].北京:清华大学出版社,1997. [2]王晓东.计算机算法设计与分析(第2版)[M].北京:电子工业 出版社,2005. [3]王克宏编译.JAVA语言与SQI 接13[M].北京:清华大学出版 社,1997.4. [4)张军.电脑家园Authorware制作多媒体[J】.南昌职业技术学院学 报,2003。(6). [5]谢光明.中国电脑教育报,2000.