java排序大全

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

java排序算法大全为了便于管理,先引入个基础类:packagealgorithms;publicabstractclassSorterEextendsComparableE{publicabstractvoidsort(E[]array,intfrom,intlen);publicfinalvoidsort(E[]array){sort(array,0,array.length);}protectedfinalvoidswap(E[]array,intfrom,intto){Etmp=array[from];array[from]=array[to];array[to]=tmp;}}一插入排序该算法在数据规模小的时候十分高效,该算法每次插入第K+1到前K个有序数组中一个合适位置,K从0开始到N-1,从而完成排序:packagealgorithms;/***@authoryovn*/publicclassInsertSorterEextendsComparableEextendsSorterE{/*(non-Javadoc)*@seealgorithms.Sorter#sort(E[],int,int)*/publicvoidsort(E[]array,intfrom,intlen){Etmp=null;for(inti=from+1;ifrom+len;i++){tmp=array[i];intj=i;for(;jfrom;j--){if(tmp.compareTo(array[j-1])0){array[j]=array[j-1];}elsebreak;}array[j]=tmp;}}}二冒泡排序这可能是最简单的排序算法了,算法思想是每次从数组末端开始比较相邻两元素,把第i小的冒泡到数组的第i个位置。i从0一直到N-1从而完成排序。(当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到数组的第N-i个位置。i从0一直到N-1从而完成排序。)packagealgorithms;/***@authoryovn**/publicclassBubbleSorterEextendsComparableEextendsSorterE{privatestaticbooleanDWON=true;publicfinalvoidbubble_down(E[]array,intfrom,intlen){for(inti=from;ifrom+len;i++){for(intj=from+len-1;ji;j--){if(array[j].compareTo(array[j-1])0){swap(array,j-1,j);}}}}publicfinalvoidbubble_up(E[]array,intfrom,intlen){for(inti=from+len-1;i=from;i--){for(intj=from;ji;j++){if(array[j].compareTo(array[j+1])0){swap(array,j,j+1);}}}}@Overridepublicvoidsort(E[]array,intfrom,intlen){if(DWON){bubble_down(array,from,len);}else{bubble_up(array,from,len);}}}三,选择排序选择排序相对于冒泡来说,它不是每次发现逆序都交换,而是在找到全局第i小的时候记下该元素位置,最后跟第i个元素交换,从而保证数组最终的有序。相对与插入排序来说,选择排序每次选出的都是全局第i小的,不会调整前i个元素了。packagealgorithms;/***@authoryovn**/publicclassSelectSorterEextendsComparableEextendsSorterE{/*(non-Javadoc)*@seealgorithms.Sorter#sort(E[],int,int)*/@Overridepublicvoidsort(E[]array,intfrom,intlen){for(inti=0;ilen;i++){intsmallest=i;intj=i+from;for(;jfrom+len;j++){if(array[j].compareTo(array[smallest])0){smallest=j;}}swap(array,i,smallest);}}}四Shell排序Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点:1)当数据规模小的时候非常高效2)当给定数据已经有序时的时间代价为O(N)所以,Shell排序每次把数据分成若个小块,来使用插入排序,而且之后在这若个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合并小块,知道最后成一个块,并使用插入排序。这里每次分成若干小块是通过“增量”来控制的,开始时增量交大,接近N/2,从而使得分割出来接近N/2个小块,逐渐的减小“增量“最终到减小到1。一直较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)所以我在实现Shell排序的时候采用该增量序列packagealgorithms;/***@authoryovn*/publicclassShellSorterEextendsComparableEextendsSorterE{/*(non-Javadoc)*Ourdeltavaluechoose2^k-1,2^(k-1)-1,.7,3,1.*complexityisO(n^1.5)*@seealgorithms.Sorter#sort(E[],int,int)*/@Overridepublicvoidsort(E[]array,intfrom,intlen){//1.calculatethefirstdeltavalue;intvalue=1;while((value+1)*2len){value=(value+1)*2-1;}for(intdelta=value;delta=1;delta=(delta+1)/2-1){for(inti=0;idelta;i++){modify_insert_sort(array,from+i,len-i,delta);}}}privatefinalvoidmodify_insert_sort(E[]array,intfrom,intlen,intdelta){if(len=1)return;Etmp=null;for(inti=from+delta;ifrom+len;i+=delta){tmp=array[i];intj=i;for(;jfrom;j-=delta){if(tmp.compareTo(array[j-delta])0){array[j]=array[j-delta];}elsebreak;}array[j]=tmp;}}}五快速排序快速排序是目前使用可能最广泛的排序算法了。一般分如下步骤:1)选择一个枢纽元素(有很对选法,我的实现里采用去中间元素的简单方法)2)使用该枢纽元素分割数组,使得比该元素小的元素在它的左边,比它大的在右边。并把枢纽元素放在合适的位置。3)根据枢纽元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。快速排序的核心在于分割算法,也可以说是最有技巧的部分。packagealgorithms;/***@authoryovn**/publicclassQuickSorterEextendsComparableEextendsSorterE{/*(non-Javadoc)*@seealgorithms.Sorter#sort(E[],int,int)*/@Overridepublicvoidsort(E[]array,intfrom,intlen){q_sort(array,from,from+len-1);}privatefinalvoidq_sort(E[]array,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,pivot+1,to);}privateintpartion(E[]array,intfrom,intto,intpivot){Etmp=array[pivot];array[pivot]=array[to];//nowto'spositionisavailablewhile(from!=to){while(fromto&&array[from].compareTo(tmp)=0)from++;if(fromto){array[to]=array[from];//nowfrom'spositionisavailableto--;}while(fromto&&array[to].compareTo(tmp)=0)to--;if(fromto){array[from]=array[to];//nowto'spositionisavailablenowfrom++;}}array[from]=tmp;returnfrom;}privateintselectPivot(E[]array,intfrom,intto){return(from+to)/2;}}六归并排序算法思想是每次把待排序列分成两部分,分别对这两部分递归地用归并排序,完成后把这两个子部分合并成一个序列。归并排序借助一个全局性临时数组来方便对子序列的归并,该算法核心在于归并。packagealgorithms;importjava.lang.reflect.Array;/***@authoryovn**/publicclassMergeSorterEextendsComparableEextendsSorterE{/*(non-Javadoc)*@seealgorithms.Sorter#sort(E[],int,int)*/@SuppressWarnings(unchecked)@Overridepublicvoidsort(E[]array,intfrom,intlen){if(len=1)return;E[]temporary=(E[])Array.newInstance(array[0].getClass(),len);merge_sort(array,from,from+len-1,temporary);}privatefinalvoidmerge_sort(E[]array,intfrom,intto,E[]temporary){if(to=from){return;}intmiddle=(from+to)/2;merge_sort(array,from,middle,temporary);merge_sort(array,middle+1,to,temporary);merge(array,from,to,middle,temporary);}privatefinalvoidmerge(E[]array,intfrom,intto,intmiddle,E[]temporary){intk=0,leftIndex=0,rightIndex=to-from;System.arraycopy(array,from,temporary,0,middle-from+1);for(inti=0;ito-middle;i++){temporary[to-from

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功