From 62ef9540bfdba4eba2adb5656722173fbe927a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=8E=D1=89=D0=B8=D0=BA=20=D0=90=D0=BD?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D0=B0=D1=81=D0=B8=D1=8F?= Date: Fri, 28 Aug 2026 22:54:04 +0300 Subject: [PATCH] refactor(sorting): reuse merge sort strategy --- .../sorting/EvenOnlyMergeSortStrategy.java | 82 ++----------------- 1 file changed, 7 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/ru/project/sorting/EvenOnlyMergeSortStrategy.java b/app/src/main/java/ru/project/sorting/EvenOnlyMergeSortStrategy.java index a784d7a..45f5b78 100644 --- a/app/src/main/java/ru/project/sorting/EvenOnlyMergeSortStrategy.java +++ b/app/src/main/java/ru/project/sorting/EvenOnlyMergeSortStrategy.java @@ -1,5 +1,6 @@ package ru.project.sorting; +import ru.project.collection.MyLinkedList; import ru.project.collection.MyList; import java.util.Comparator; @@ -7,9 +8,11 @@ import java.util.function.ToIntFunction; public class EvenOnlyMergeSortStrategy implements SortStrategy { private final ToIntFunction valueExtractor; + private final SortStrategy mergeSortStrategy; public EvenOnlyMergeSortStrategy(ToIntFunction valueExtractor) { this.valueExtractor = valueExtractor; + this.mergeSortStrategy = new MergeSortStrategy<>(); } @Override @@ -32,8 +35,7 @@ public class EvenOnlyMergeSortStrategy implements SortStrategy { return; } - @SuppressWarnings("unchecked") - T[] evenElements = (T[]) new Object[evenCount]; + MyList evenElements = new MyLinkedList<>(); int[] evenIndexes = new int[evenCount]; @@ -43,85 +45,15 @@ public class EvenOnlyMergeSortStrategy implements SortStrategy { T element = list.get(i); if (valueExtractor.applyAsInt(element) % 2 == 0) { - evenElements[evenIndex] = element; + evenElements.add(element); evenIndexes[evenIndex] = i; evenIndex++; } } - mergeSort(evenElements, 0, evenElements.length - 1, comparator); + mergeSortStrategy.sort(evenElements, comparator); for (int i = 0; i < evenIndexes.length; i++) { - list.set(evenIndexes[i], evenElements[i]); - } - } - - private void mergeSort( - T[] elements, - int left, - int right, - Comparator comparator - ) { - if (left >= right) { - return; - } - - int mid = (left + right) / 2; - - mergeSort(elements, left, mid, comparator); - mergeSort(elements, mid + 1, right, comparator); - - merge(elements, left, mid, right, comparator); - } - private void merge( - T[] elements, - int left, - int mid, - int right, - Comparator comparator - ) { - int leftSize = mid - left + 1; - int rightSize = right - mid; - - @SuppressWarnings("unchecked") - T[] leftArray = (T[]) new Object[leftSize]; - - @SuppressWarnings("unchecked") - T[] rightArray = (T[]) new Object[rightSize]; - - for (int i = 0; i < leftSize; i++) { - leftArray[i] = elements[left + i]; - } - - for (int j = 0; j < rightSize; j++) { - rightArray[j] = elements[mid + 1 + j]; - } - - int i = 0; - int j = 0; - int k = left; - - while (i < leftSize && j < rightSize) { - if (comparator.compare(leftArray[i], rightArray[j]) <= 0) { - elements[k] = leftArray[i]; - i++; - } else { - elements[k] = rightArray[j]; - j++; - } - - k++; - } - - while (i < leftSize) { - elements[k] = leftArray[i]; - i++; - k++; - } - - while (j < rightSize) { - elements[k] = rightArray[j]; - j++; - k++; + list.set(evenIndexes[i], evenElements.get(i)); } } }