1+ package sorting ;
2+
3+ import dto .Client ;
4+ import java .util .ArrayList ;
5+ import java .util .Comparator ;
6+ import java .util .List ;
7+
8+ public class MergeSortStrategy implements SortingStrategy {
9+
10+ @ Override
11+ public void sort (List <Client > clients ) {
12+ Comparator <Client > comparator = createDefaultComparator ();
13+ sortWithComparator (clients , comparator );
14+ }
15+
16+ public void sortWithComparator (List <Client > clients , Comparator <Client > comparator ) {
17+ if (clients == null || clients .size () <= 1 ) {
18+ return ;
19+ }
20+
21+ mergeSort (clients , 0 , clients .size () - 1 , comparator );
22+ }
23+
24+ @ Override
25+ public String getStrategyName () {
26+ return "Merge Sort (сортировка слиянием)" ;
27+ }
28+
29+ private Comparator <Client > createDefaultComparator () {
30+ return new Comparator <Client >() {
31+ @ Override
32+ public int compare (Client client1 , Client client2 ) {
33+ int nameComparison = client1 .getName ().compareTo (client2 .getName ());
34+ if (nameComparison != 0 ) {
35+ return nameComparison ;
36+ }
37+
38+ int idComparison = Integer .compare (client1 .getIdNumber (), client2 .getIdNumber ());
39+ if (idComparison != 0 ) {
40+ return idComparison ;
41+ }
42+
43+ return client1 .getPhoneNumber ().compareTo (client2 .getPhoneNumber ());
44+ }
45+ };
46+ }
47+ private void mergeSort (List <Client > clients , int left , int right ,
48+ Comparator <Client > comparator ) {
49+
50+ if (left < right ) {
51+ int mid = left + (right - left ) / 2 ;
52+
53+ mergeSort (clients , left , mid , comparator );
54+
55+ mergeSort (clients , mid + 1 , right , comparator );
56+
57+ merge (clients , left , mid , right , comparator );
58+ }
59+ }
60+
61+
62+ private void merge (List <Client > clients , int left , int mid , int right ,
63+ Comparator <Client > comparator ) {
64+
65+ List <Client > temp = new ArrayList <>();
66+
67+ int i = left ;
68+ int j = mid + 1 ;
69+
70+
71+ while (i <= mid && j <= right ) {
72+ Client leftClient = clients .get (i );
73+ Client rightClient = clients .get (j );
74+
75+
76+ int comparison = comparator .compare (leftClient , rightClient );
77+
78+
79+ if (comparison <= 0 ) {
80+ temp .add (leftClient );
81+ i ++;
82+ } else {
83+ temp .add (rightClient );
84+ j ++;
85+ }
86+ }
87+
88+ while (i <= mid ) {
89+ temp .add (clients .get (i ));
90+ i ++;
91+ }
92+
93+ while (j <= right ) {
94+ temp .add (clients .get (j ));
95+ j ++;
96+ }
97+
98+ for (int k = 0 ; k < temp .size (); k ++) {
99+ clients .set (left + k , temp .get (k ));
100+ }
101+ }
102+ }
0 commit comments