From b36f3590764811fc3be13ce190fcf5a99c74e4fd Mon Sep 17 00:00:00 2001 From: Marcus <104601262+MarcusCody@users.noreply.github.com> Date: Sun, 7 Aug 2022 04:22:42 +0800 Subject: [PATCH] Add Strand Sort (#3205) --- .../com/thealgorithms/sorts/StrandSort.java | 42 +++++++++++++++++++ .../thealgorithms/sorts/StrandSortTest.java | 39 +++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 src/main/java/com/thealgorithms/sorts/StrandSort.java create mode 100644 src/test/java/com/thealgorithms/sorts/StrandSortTest.java diff --git a/src/main/java/com/thealgorithms/sorts/StrandSort.java b/src/main/java/com/thealgorithms/sorts/StrandSort.java new file mode 100644 index 000000000..8b31f7c4e --- /dev/null +++ b/src/main/java/com/thealgorithms/sorts/StrandSort.java @@ -0,0 +1,42 @@ +package com.thealgorithms.sorts; +import java.util.Iterator; +import java.util.LinkedList; + +public class StrandSort{ + // note: the input list is destroyed + public static > + LinkedList strandSort(LinkedList 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(); + } + } + result = merge(sorted, result); + } + 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()); + else + result.add(right.remove()); + } + result.addAll(left); + result.addAll(right); + return result; + } + +} diff --git a/src/test/java/com/thealgorithms/sorts/StrandSortTest.java b/src/test/java/com/thealgorithms/sorts/StrandSortTest.java new file mode 100644 index 000000000..f24596e70 --- /dev/null +++ b/src/test/java/com/thealgorithms/sorts/StrandSortTest.java @@ -0,0 +1,39 @@ +package com.thealgorithms.sorts; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Arrays; +import java.util.LinkedList; + + +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); + + } + +} + +