From a9999e679554f6003254983d7a591bc6422c7082 Mon Sep 17 00:00:00 2001 From: alx Date: Thu, 20 Jun 2024 12:56:57 +0200 Subject: [PATCH 1/4] Refactoring and code improving for StrandSort --- .../com/thealgorithms/sorts/StrandSort.java | 88 +++++++++++++------ .../thealgorithms/sorts/StrandSortTest.java | 34 +------ 2 files changed, 67 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/thealgorithms/sorts/StrandSort.java b/src/main/java/com/thealgorithms/sorts/StrandSort.java index 51600812bbb1..5fbb8283e170 100644 --- a/src/main/java/com/thealgorithms/sorts/StrandSort.java +++ b/src/main/java/com/thealgorithms/sorts/StrandSort.java @@ -1,46 +1,84 @@ package com.thealgorithms.sorts; -import java.util.Iterator; -import java.util.LinkedList; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -public final class StrandSort { - private StrandSort() { +/** + * StrandSort class implementing the SortAlgorithm interface using arrays. + */ +public final class StrandSort implements SortAlgorithm { + + /** + * Sorts the given array using the Strand Sort algorithm. + * + * @param The type of elements to be sorted, must be Comparable. + * @param unsorted The array to be sorted. + * @return The sorted array. + */ + @Override + public > T[] sort(T[] unsorted) { + List unsortedList = new ArrayList<>(Arrays.asList(unsorted)); + List sortedList = strandSort(unsortedList); + return sortedList.toArray(unsorted); } - // note: the input list is destroyed - public static > LinkedList strandSort(LinkedList list) { + /** + * Strand Sort algorithm that sorts a list. + * + * @param The type of elements to be sorted, must be Comparable. + * @param list The list to be sorted. + * @return The sorted list. + */ + private static > List strandSort(List list) { if (list.size() <= 1) { return list; } - LinkedList result = new LinkedList(); - while (list.size() > 0) { - LinkedList sorted = new LinkedList(); - sorted.add(list.removeFirst()); // same as remove() or remove(0) - for (Iterator it = list.iterator(); it.hasNext();) { - E elem = it.next(); - if (sorted.peekLast().compareTo(elem) <= 0) { - sorted.addLast(elem); // same as add(elem) or add(0, elem) - it.remove(); + List result = new ArrayList<>(); + while (!list.isEmpty()) { + final List sorted = new ArrayList<>(); + sorted.add(list.remove(0)); + for (int i = 0; i < list.size();) { + if (sorted.get(sorted.size() - 1).compareTo(list.get(i)) <= 0) { + sorted.add(list.remove(i)); + } else { + i++; } } - result = merge(sorted, result); + result = merge(result, sorted); } return result; } - private static > LinkedList merge(LinkedList left, LinkedList right) { - LinkedList result = new LinkedList(); - while (!left.isEmpty() && !right.isEmpty()) { - // change the direction of this comparison to change the direction of the sort - if (left.peek().compareTo(right.peek()) <= 0) { - result.add(left.remove()); + /** + * Merges two sorted lists into one sorted list. + * + * @param The type of elements to be sorted, must be Comparable. + * @param left The first sorted list. + * @param right The second sorted list. + * @return The merged sorted list. + */ + private static > List merge(List left, List right) { + List result = new ArrayList<>(); + int i = 0, j = 0; + while (i < left.size() && j < right.size()) { + if (left.get(i).compareTo(right.get(j)) <= 0) { + result.add(left.get(i)); + i++; } else { - result.add(right.remove()); + result.add(right.get(j)); + j++; } } - result.addAll(left); - result.addAll(right); + while (i < left.size()) { + result.add(left.get(i)); + i++; + } + while (j < right.size()) { + result.add(right.get(j)); + j++; + } return result; } } diff --git a/src/test/java/com/thealgorithms/sorts/StrandSortTest.java b/src/test/java/com/thealgorithms/sorts/StrandSortTest.java index 91e85c81e5ec..5e63c9520392 100644 --- a/src/test/java/com/thealgorithms/sorts/StrandSortTest.java +++ b/src/test/java/com/thealgorithms/sorts/StrandSortTest.java @@ -1,34 +1,8 @@ package com.thealgorithms.sorts; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; - -import java.util.Arrays; -import java.util.LinkedList; -import org.junit.jupiter.api.Test; - -class StrandSortTest { - - @Test - // valid test case - public void strandSortNonDuplicateTest() { - int[] expectedArray = {1, 2, 3, 4, 5}; - LinkedList actualList = StrandSort.strandSort(new LinkedList(Arrays.asList(3, 1, 2, 4, 5))); - int[] actualArray = new int[actualList.size()]; - for (int i = 0; i < actualList.size(); i++) { - actualArray[i] = actualList.get(i); - } - assertArrayEquals(expectedArray, actualArray); - } - - @Test - // valid test case - public void strandSortDuplicateTest() { - int[] expectedArray = {2, 2, 2, 5, 7}; - LinkedList actualList = StrandSort.strandSort(new LinkedList(Arrays.asList(7, 2, 2, 2, 5))); - int[] actualArray = new int[actualList.size()]; - for (int i = 0; i < actualList.size(); i++) { - actualArray[i] = actualList.get(i); - } - assertArrayEquals(expectedArray, actualArray); +class StrandSortTest extends SortingAlgorithmTest{ + @Override + SortAlgorithm getSortAlgorithm() { + return new StrandSort(); } } From c3f92d2effd297cca223756bba989c60bdefb65f Mon Sep 17 00:00:00 2001 From: alx Date: Thu, 20 Jun 2024 12:59:28 +0200 Subject: [PATCH 2/4] Fix java checkstyle --- src/test/java/com/thealgorithms/sorts/StrandSortTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/sorts/StrandSortTest.java b/src/test/java/com/thealgorithms/sorts/StrandSortTest.java index 5e63c9520392..a7250acf9bec 100644 --- a/src/test/java/com/thealgorithms/sorts/StrandSortTest.java +++ b/src/test/java/com/thealgorithms/sorts/StrandSortTest.java @@ -1,6 +1,6 @@ package com.thealgorithms.sorts; -class StrandSortTest extends SortingAlgorithmTest{ +class StrandSortTest extends SortingAlgorithmTest { @Override SortAlgorithm getSortAlgorithm() { return new StrandSort(); From a7dc027aa90feff40c26b7b9aebe4b740abd4626 Mon Sep 17 00:00:00 2001 From: alx Date: Thu, 20 Jun 2024 13:02:52 +0200 Subject: [PATCH 3/4] Fix "Each variable declaration must be in its own statement" --- src/main/java/com/thealgorithms/sorts/StrandSort.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/sorts/StrandSort.java b/src/main/java/com/thealgorithms/sorts/StrandSort.java index 5fbb8283e170..2d6e35e0ffc0 100644 --- a/src/main/java/com/thealgorithms/sorts/StrandSort.java +++ b/src/main/java/com/thealgorithms/sorts/StrandSort.java @@ -61,7 +61,8 @@ private static > List strandSort(List list */ private static > List merge(List left, List right) { List result = new ArrayList<>(); - int i = 0, j = 0; + int i = 0; + int j = 0; while (i < left.size() && j < right.size()) { if (left.get(i).compareTo(right.get(j)) <= 0) { result.add(left.get(i)); From 5d45dada16fc0066d86273b8e74d9a9bdb46b816 Mon Sep 17 00:00:00 2001 From: alx Date: Thu, 20 Jun 2024 13:10:05 +0200 Subject: [PATCH 4/4] Fix "uses integer based for loops to iterate over a List" --- src/main/java/com/thealgorithms/sorts/StrandSort.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/thealgorithms/sorts/StrandSort.java b/src/main/java/com/thealgorithms/sorts/StrandSort.java index 2d6e35e0ffc0..58cd35628506 100644 --- a/src/main/java/com/thealgorithms/sorts/StrandSort.java +++ b/src/main/java/com/thealgorithms/sorts/StrandSort.java @@ -72,14 +72,8 @@ private static > List merge(List left, Lis j++; } } - while (i < left.size()) { - result.add(left.get(i)); - i++; - } - while (j < right.size()) { - result.add(right.get(j)); - j++; - } + result.addAll(left.subList(i, left.size())); + result.addAll(right.subList(j, right.size())); return result; } }