package cn.ahern88.algorithm; |
02 |
03 |
import java.util.Arrays; |
04 |
05 |
/** |
06 |
*
归并排序,从小到大 |
07 |
*
归并排序算法一般需要三步 |
08 |
*
1. 左边排序 |
09 |
*
2. 右边排序 |
10 |
*
3. 合并 |
11 |
*
需要用到递归调用 |
12 |
*
@author ahern88 |
13 |
*/ |
14 |
public class MergeSort
{ |
15 |
16 |
public int []
sort( int []
arrs){ |
17 |
if (arrs.length
< 2 ){ |
18 |
return arrs; |
19 |
} |
20 |
int middle
= arrs.length % 2 == 0 ?
arrs.length / 2 :
(arrs.length - 1 )
/ 2 ; |
21 |
int []
left = Arrays.copyOfRange(arrs, 0 ,
middle); |
22 |
int []
right = Arrays.copyOfRange(arrs, middle, arrs.length); |
23 |
int []
lres = sort(left); |
24 |
int []
rres = sort(right); |
25 |
return merge(lres,
rres); |
26 |
} |
27 |
28 |
private int []
merge( int []
lres, int []
rres) { |
29 |
int []
res = new int [lres.length
+ rres.length]; |
30 |
int l
= 0 ; |
31 |
int r
= 0 ; |
32 |
int c
= 0 ; |
33 |
while (l
< lres.length && r < rres.length){ |
34 |
if (lres[l]
< rres[r]){ |
35 |
res[c++]
= lres[l++]; |
36 |
} else { |
37 |
res[c++]
= rres[r++]; |
38 |
} |
39 |
} |
40 |
if (l
== lres.length){ |
41 |
while (r
< rres.length){ |
42 |
res[c++]
= rres[r++]; |
43 |
} |
44 |
return res; |
45 |
} |
46 |
if (r
== rres.length){ |
47 |
while (l
< lres.length){ |
48 |
res[c++]
= lres[l++]; |
49 |
} |
50 |
return res; |
51 |
} |
52 |
return res; |
53 |
} |
54 |
|
55 |
} |