1+ import java .util .Arrays ;
2+ import java .util .ArrayList ;
3+ import java .util .List ;
4+
5+ public class MergeSortRecursive {
6+
7+ List <Integer > arr ;
8+
9+ public MergeSortRecursive (List <Integer > arr ) {
10+ this .arr = arr ;
11+ }
12+
13+ public void mergeSort () {
14+ List <Integer > arrSorted = merge (arr );
15+ System .out .println (arrSorted );
16+ }
17+
18+ private static List <Integer > merge (List <Integer > arr ) {
19+
20+ // base condition
21+ if (arr .size () <= 1 ) {
22+ return arr ;
23+ }
24+
25+ int arrLength = arr .size ();
26+ int half = arrLength / 2 ;
27+ List <Integer > arrA = arr .subList (0 , half );
28+ List <Integer > arrB = arr .subList (half , arr .size ());
29+
30+ // recursion
31+ arrA = merge (arrA );
32+ arrB = merge (arrB );
33+
34+ return sort (arrA , arrB );
35+ }
36+
37+ private static List <Integer > sort (List <Integer > unsortedA , List <Integer > unsortedB ) {
38+ if (unsortedA .size () <= 0 && unsortedB .size () <= 0 ) {
39+ return new ArrayList <>();
40+ }
41+ if (unsortedA .size () <= 0 ) {
42+ return unsortedB ;
43+ }
44+ if (unsortedB .size () <= 0 ) {
45+ return unsortedA ;
46+ }
47+ if (unsortedA .get (0 ) <= unsortedB .get (0 )) {
48+ List <Integer > newAl = new ArrayList <Integer >() {
49+ {
50+ add (unsortedA .get (0 ));
51+ }
52+ };
53+ newAl .addAll (sort (unsortedA .subList (1 , unsortedA .size ()), unsortedB ));
54+ return newAl ;
55+ } else {
56+ List <Integer > newAl = new ArrayList <Integer >() {
57+ {
58+ add (unsortedB .get (0 ));
59+ }
60+ };newAl .addAll (sort (unsortedA , unsortedB .subList (1 , unsortedB .size ())));
61+ return newAl ;
62+ }
63+ }
64+
65+ }
66+
67+ class App {
68+ public static void main (String [] args ) {
69+ MergeSortRecursive sort = new MergeSortRecursive (new ArrayList <>(Arrays .asList (4 , 3 , 1 , 8 , 5 , 10 , 0 , 1 , 4 , 11 , 8 , 9 )));
70+ sort .mergeSort ();
71+ }
72+ }
0 commit comments