1、arrayfrom=arrayto;arrayto=tmp;一 插入排序该算法在数据规模小的时候十分高效,该算法每次插入第K+1到前K个有序数组中一个合适位置,K从0开始到N-1,从而完成排序:/*authoryovn*/InsertSorter/*(non-Javadoc)seealgorithms.Sorter#sort(E,int,int)array,intfrom,len)tmp=null;for(inti=from+1;ifrom;j-)if(pareTo(arrayj-1)0)arrayj=arrayj-1;elsebreak;arrayj=tmp;二 冒泡排序这可能是最简单的排序
2、算法了,算法思想是每次从数组末端开始比较相邻两元素,把第i小的冒泡到数组的第i个位置。i从0一直到N-1从而完成排序。(当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到数组的第N-i个位置。)*BubbleSorterprivatestaticbooleanDWON=true;bubble_down(Elen)i=from;j=from+len-1;i;if(array pareTo(array j-1)=from;i-)j=from;jswap(array,j,j+1);Overrideif(DWON)bubble_down(array,from,len);elsebubble_u
3、p(array,from,len);三 选择排序选择排序相对于冒泡来说,它不是每次发现逆序都交换,而是在找到全局第i小的时候记下该元素位置,最后跟第i个元素交换,从而保证数组最终的有序。相对与插入排序来说,选择排序每次选出的都是全局第i小的,不会调整前i个元素了。SelectSorteri=0;len;smallest=i;j=i+from;if(pareTo(arraysmallest)smallest=j;swap(array,i,smallest); 四 Shell排序Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点:1)当数据规模小的时候非常高效2)当给定数据已经
4、有序时的时间代价为O(N)所以,Shell排序每次把数据分成若个小块,来使用插入排序,而且之后在这若个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合并小块,知道最后成一个块,并使用插入排序。这里每次分成若干小块是通过“增量” 来控制的,开始时增量交大,接近N/2,从而使得分割出来接近N/2个小块,逐渐的减小“增量“最终到减小到1。一直较好的增量序列是2k-1,2(k-1)-1,.7,3,1,这样可使Shell排序时间复杂度达到O(N1.5)所以我在实现Shell排序的时候采用该增量序列ShellSorterOurdeltavaluechoose2k-1,2(k-1)-1,
5、.7,3,plexityisO(n1.5)/1.calculatethefirstvalue;value=1;while(value+1)*2=1;delta=(delta+1)/2-1)delta;modify_insert_sort(array,from+i,len-i,delta);modify_insert_sort(Elen,intdelta)if(len=1)return;i=from+delta;i+=delta)j-=delta)if(pareTo(arrayj-delta)arrayj=arrayj-delta;五 快速排序快速排序是目前使用可能最广泛的排序算法了。一般分如下
6、步骤:1)选择一个枢纽元素(有很对选法,我的实现里采用去中间元素的简单方法)2)使用该枢纽元素分割数组,使得比该元素小的元素在它的左边,比它大的在右边。并把枢纽元素放在合适的位置。3)根据枢纽元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。快速排序的核心在于分割算法,也可以说是最有技巧的部分。QuickSorterq_sort(array,from,from+len-1);q_sort(Eto)if(to-from1)return;pivot=selectPivot(array,from,to);pivot=partion(ar
7、ray,from,to,pivot);q_sort(array,from,pivot-1);q_sort(array,pivot+1,to);partion(Eto,pivot)tmp=arraypivot;arraypivot=arrayto;/nowtospositionavailablewhile(from!=to)while(fromto&pareTo(tmp)=0)from+;if(from=0)to-;availablenowfrom+;arrayfrom=tmp;returnselectPivot(E(from+to)/2;六 归并排序算法思想是每次把待排序列分成两部分,分别对这
8、两部分递归地用归并排序,完成后把这两个子部分合并成一个序列。归并排序借助一个全局性临时数组来方便对子序列的归并,该算法核心在于归并。importjava.lang.reflect.Array;MergeSorterSuppressWarnings(uncheckedEtemporary=(E)Array.newInstance(array0.getClass(),len);merge_sort(array,from,from+len-1,temporary);merge_sort(Etemporary)if(to=from)return;middle=(from+to)/2;merge_sor
9、t(array,from,middle,temporary);merge_sort(array,middle+1,to,temporary);merge(array,from,to,middle,temporary);merge(Emiddle,k=0,leftIndex=0,rightIndex=to-from;System.arraycopy(array,temporary,0,middle-from+1);to-middle;temporaryto-from-i=arraymiddle+i+1;while(kto-from+1)if(temporaryleftIpareTo(tempor
10、aryrightIndex)arrayk+from=temporaryleftIndex+;arrayk+from=temporaryrightIndex-;k+;七 堆排序堆是一种完全二叉树,一般使用数组来实现。堆主要有两种核心操作,1)从指定节点向上调整(shiftUp)2)从指定节点向下调整(shiftDown)建堆,以及删除堆定节点使用shiftDwon,而在插入节点时一般结合两种操作一起使用。堆排序借助最大值堆来实现,第i次从堆顶移除最大值放到数组的倒数第i个位置,然后shiftDown到倒数第i+1个位置,一共执行N此调整,即完成排序。显然,堆排序也是一种选择性的排序,每次选择第i
11、大的元素。HeapSorterbuild_heap(array,from,len);/swapmaxto(len-i)-thpositionswap(array,from,from+len-1-i);shift_down(array,from,len-1-i,0);/alwaysshiftDownprivate final voidbuild_heap(Epos=(len-1)/2;/westart(len-1)/2,becausebranchnode+1=leafnode,andallleafalreadyaheapi=pos;=0;shift_down(array,from,len,i);shift_down(Elen,pos)tmp=arrayfrom+pos;index=pos*2+1;/useleftchildwhile(indexlen)/untilnoif(index+1len&arrayfrom+pareTo(arrayfrom+index+1)0)/rightchildbiggerindex+=1;/switchrightif(pareTo(arrayfrom+index)arrayfrom+pos=arrayfrom+index;pos=index;els
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1