归并排序java实现

来源:互联网 发布:nginx lua 连接redis 编辑:程序博客网 时间:2024/06/07 14:18

归并排序 :

中文理解就是合并的意思,.也就是号将两个分开的部分,合并成为一个整体,可是,如何实现所谓合并呢?

Merging Sort: Merge :

其实更好的体现了算法的思想,将部分——>merge——>成为整体,Merge,像和面一样,很充分的结合。

原理先分后和):


step1:将一个无序的序列分开为n个有序的长为1的子序列

step2:n个中两两配对按顺序合并,得到n/2个有序子序列

step3:n/2个里再继续两两按顺序合并,得到n/4个有序子序列

...

step end:最后2个按顺序合并,成为一个n长的有序序列


下面代码为将序列进行分开并合并:

public void Msort1(int[] SR, int[] TR, int s, int t){int m;int[] TR1 = new int[MAXSIZE];if(s==t)TR[s] =SR[s];else{m=(s + t)/2;Msort1(SR, TR1, s, m);//先分段Msort1(SR, TR1 ,m+1, t);Merge(TR1, TR, s, m, t);//再将分段后的进行合并排序}}

下面代码为将两个序列进行Merge:
private void Merge(int[] S, int[] Result, int start, int mid, int end){int j,k,l;//先将S[]数组分段,左边的S[Start]和右边的S[j]按顺序进行比较//比较后,将较小的以此放入新的数组result[K]中for(j = mid+1,k = start; s <= mid && j <= end; k++){if(S[start] < S[j]){Result[k] = S[start++];}else{Result[k] = S[j++];}}//最后两段比较后,若只剩下左边的一部分,则直接按顺序写入result[]的后面if(s <= mid){for(l=0; l != mid-start; l++)    Result[k+l] = S[start+l];}}//同理,最后若只剩下左边的一部分,则直接按顺序写入result[]的后面if(j <= end){for(l=0; l != end-j; l++){Result[k+l] = S[j+l];}}}

测试用例:
输入:{50,10,80,90,40,20,30,60,70,110,100}
输出:{10 20 30 40 50 60 70 80 90 100 110} 


0 0