您的位置:首页 > 编程语言 > Java开发

归并排序java实现

2017-04-11 10:10 337 查看
归并排序 :

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

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
4000
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} 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 归并排序 合并