java排序算法大全(共16页).doc
《java排序算法大全(共16页).doc》由会员分享,可在线阅读,更多相关《java排序算法大全(共16页).doc(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上 java排序算法大全为了便于管理,先引入个基础类:packagealgorithms;publicabstractclassSorterEextendsComparablepublicabstractvoidsort(Earray,intfrom,intlen);publicfinalvoidsort(Earray)sort(array,0,array.length); protectedfinalvoidswap(Earray,intfrom,intto) Etmp=arrayfrom;arrayfrom=arrayto;arrayto=tmp; 一 插入排序该算
2、法在数据规模小的时候十分高效,该算法每次插入第K+1到前K个有序数组中一个合适位置,K从0开始到N-1,从而完成排序:packagealgorithms;/*authoryovn*/publicclassInsertSorterEextendsComparableextendsSorterpublicvoidsort(Earray,intfrom,intlen)Etmp=null;for(inti=from+1;ifrom;j-)if(pareTo(arrayj-1)0)arrayj=arrayj-1;elsebreak;arrayj=tmp;二 冒泡排序这可能是最简单的排序算法了,算法思想是
3、每次从数组末端开始比较相邻两元素,把第i小的冒泡到数组的第i个位置。i从0一直到N-1从而完成排序。(当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到数组的第N-i个位置。i从0一直到N-1从而完成排序。)packagealgorithms;/*authoryovn*/publicclassBubbleSorterEextendsComparableextendsSorterprivatestaticbooleanDWON=true;publicfinalvoidbubble_down(Earray,intfrom,intlen)for(inti=from;ii;j-)if(pare
4、To(arrayj-1)=from;i-)for(intj=from;j0)swap(array,j,j+1);Overridepublicvoidsort(Earray,intfrom,intlen)if(DWON)bubble_down(array,from,len);elsebubble_up(array,from,len);三,选择排序选择排序相对于冒泡来说,它不是每次发现逆序都交换,而是在找到全局第i小的时候记下该元素位置,最后跟第i个元素交换,从而保证数组最终的有序。相对与插入排序来说,选择排序每次选出的都是全局第i小的,不会调整前i个元素了。packagealgorithms;/
5、*authoryovn*/publicclassSelectSorterEextendsComparableextendsSorter/*(non-Javadoc)*seealgorithms.Sorter#sort(E,int,int)*/Overridepublicvoidsort(Earray,intfrom,intlen)for(inti=0;ilen;i+)intsmallest=i;intj=i+from;for(;jfrom+len;j+)if(pareTo(arraysmallest)0)smallest=j;swap(array,i,smallest); 四 Shell排序S
6、hell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点:1)当数据规模小的时候非常高效2)当给定数据已经有序时的时间代价为O(N)所以,Shell排序每次把数据分成若个小块,来使用插入排序,而且之后在这若个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合并小块,知道最后成一个块,并使用插入排序。这里每次分成若干小块是通过“增量” 来控制的,开始时增量交大,接近N/2,从而使得分割出来接近N/2个小块,逐渐的减小“增量“最终到减小到1。一直较好的增量序列是2k-1,2(k-1)-1,.7,3,1,这样可使Shell排序时间复杂度达到O(N1.5)所以我在实现Sh
7、ell排序的时候采用该增量序列packagealgorithms;/*authoryovn*/publicclassShellSorterEextendsComparableextendsSorter/*(non-Javadoc)*Ourdeltavaluechoose2k-1,2(k-1)-1,.7,3,1.*complexityisO(n1.5)*seealgorithms.Sorter#sort(E,int,int)*/Overridepublicvoidsort(Earray,intfrom,intlen)/1.calculatethefirstdeltavalue;intvalue=
8、1;while(value+1)*2=1;delta=(delta+1)/2-1)for(inti=0;idelta;i+)modify_insert_sort(array,from+i,len-i,delta);privatefinalvoidmodify_insert_sort(Earray,intfrom,intlen,intdelta)if(len=1)return;Etmp=null;for(inti=from+delta;ifrom;j-=delta)if(pareTo(arrayj-delta)0)arrayj=arrayj-delta;elsebreak;arrayj=tmp;
9、五 快速排序快速排序是目前使用可能最广泛的排序算法了。一般分如下步骤:1)选择一个枢纽元素(有很对选法,我的实现里采用去中间元素的简单方法)2)使用该枢纽元素分割数组,使得比该元素小的元素在它的左边,比它大的在右边。并把枢纽元素放在合适的位置。3)根据枢纽元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。快速排序的核心在于分割算法,也可以说是最有技巧的部分。packagealgorithms;/*authoryovn*/publicclassQuickSorterEextendsComparableextendsSorter/*(
10、non-Javadoc)*seealgorithms.Sorter#sort(E,int,int)*/Overridepublicvoidsort(Earray,intfrom,intlen)q_sort(array,from,from+len-1);privatefinalvoidq_sort(Earray,intfrom,intto)if(to-from1)return;intpivot=selectPivot(array,from,to);pivot=partion(array,from,to,pivot);q_sort(array,from,pivot-1);q_sort(array,
11、pivot+1,to);privateintpartion(Earray,intfrom,intto,intpivot)Etmp=arraypivot;arraypivot=arrayto;/nowtospositionisavailablewhile(from!=to)while(fromto&pareTo(tmp)=0)from+;if(fromto)arrayto=arrayfrom;/nowfromspositionisavailableto-;while(from=0)to-;if(fromto)arrayfrom=arrayto;/nowtospositionisavailable
12、nowfrom+;arrayfrom=tmp;returnfrom;privateintselectPivot(Earray,intfrom,intto)return(from+to)/2;六 归并排序算法思想是每次把待排序列分成两部分,分别对这两部分递归地用归并排序,完成后把这两个子部分合并成一个序列。归并排序借助一个全局性临时数组来方便对子序列的归并,该算法核心在于归并。packagealgorithms;importjava.lang.reflect.Array;/*authoryovn*/publicclassMergeSorterEextendsComparableextendsSo
13、rter/*(non-Javadoc)*seealgorithms.Sorter#sort(E,int,int)*/SuppressWarnings(unchecked)Overridepublicvoidsort(Earray,intfrom,intlen)if(len=1)return;Etemporary=(E)Array.newInstance(array0.getClass(),len);merge_sort(array,from,from+len-1,temporary);privatefinalvoidmerge_sort(Earray,intfrom,intto,Etempor
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 排序 算法 大全 16
限制150内