From dfdce96c6e715c1229384568473ec2251e6eb72e Mon Sep 17 00:00:00 2001 From: BranAndSceolan <98578040+BranAndSceolan@users.noreply.github.com> Date: Mon, 25 Apr 2022 16:02:15 +0200 Subject: [PATCH] Add Dutch National Flag Sort (#3025) Co-authored-by: Antonia Strack Co-authored-by: Andrii Siriak --- .../sorts/DutchNationalFlagSort.java | 44 +++++++ .../sorts/DutchNationalFlagSortTest.java | 112 ++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java create mode 100644 src/test/java/com/thealgorithms/sorts/DutchNationalFlagSortTest.java diff --git a/src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java b/src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java new file mode 100644 index 000000000..a2e32c2f0 --- /dev/null +++ b/src/main/java/com/thealgorithms/sorts/DutchNationalFlagSort.java @@ -0,0 +1,44 @@ +package com.thealgorithms.sorts; + +/** + * The Dutch National Flag Sort sorts a sequence of values into three permutations which are defined by a value given + * as the indented middle. + * First permutation: values less than middle. + * Second permutation: values equal middle. + * Third permutation: values greater than middle. + * If no indented middle is given, this implementation will use a value from the given Array. + * This value is the one positioned in the arrays' middle if the arrays' length is odd. + * If the arrays' length is even, the value left to the middle will be used. + * More information and Pseudocode: https://en.wikipedia.org/wiki/Dutch_national_flag_problem + */ +public class DutchNationalFlagSort implements SortAlgorithm { + + @Override + public > T[] sort(T[] unsorted) { + return dutch_national_flag_sort(unsorted, unsorted[(int) Math.ceil((unsorted.length)/2.0) -1]); + } + + public > T[] sort(T[] unsorted, T intendedMiddle) { + return dutch_national_flag_sort(unsorted, intendedMiddle); + } + + private > T[] dutch_national_flag_sort(T[] arr, T intendedMiddle){ + int i = 0; + int j = 0; + int k = arr.length - 1; + + while( j <= k){ + if ( 0 > arr[j].compareTo(intendedMiddle)){ + SortUtils.swap(arr, i, j); + j++; + i++; + } else if (0 < arr[j].compareTo(intendedMiddle)){ + SortUtils.swap(arr, j, k); + k--; + } else { + j++; + } + } + return arr; + } +} diff --git a/src/test/java/com/thealgorithms/sorts/DutchNationalFlagSortTest.java b/src/test/java/com/thealgorithms/sorts/DutchNationalFlagSortTest.java new file mode 100644 index 000000000..56df1b359 --- /dev/null +++ b/src/test/java/com/thealgorithms/sorts/DutchNationalFlagSortTest.java @@ -0,0 +1,112 @@ +package com.thealgorithms.sorts; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; + +public class DutchNationalFlagSortTest { + @Test + /* + 1 will be used as intended middle. + Partitions on the result array: [ smaller than 1 , equal 1, greater than 1] + */ + void DNFSTestOdd() { + Integer[] integers = {1, 3, 1, 4, 0}; + Integer[] integersResult = {0, 1, 1, 4, 3}; + DutchNationalFlagSort dutchNationalFlagSort = new DutchNationalFlagSort(); + dutchNationalFlagSort.sort(integers); + assertArrayEquals(integers, integersResult); + } + + @Test + /* + 3 will be used as intended middle. + Partitions on the result array: [ smaller than 3 , equal 3, greater than 3] + */ + void DNFSTestEven() { + Integer[] integers = {8, 1, 3, 1, 4, 0}; + Integer[] integersResult = {0, 1, 1, 3, 4, 8}; + DutchNationalFlagSort dutchNationalFlagSort = new DutchNationalFlagSort(); + dutchNationalFlagSort.sort(integers); + assertArrayEquals(integers, integersResult); + } + + @Test + /* + "b" will be used as intended middle. + Partitions on the result array: [ smaller than b , equal b, greater than b] + */ + void DNFSTestEvenStrings() { + String[] strings = {"a", "d", "b", "s", "e", "e"}; + String[] stringsResult = {"a", "b", "s", "e", "e", "d"}; + DutchNationalFlagSort dutchNationalFlagSort = new DutchNationalFlagSort(); + dutchNationalFlagSort.sort(strings); + assertArrayEquals(strings, stringsResult); + } + + @Test + /* + "b" will be used as intended middle. + Partitions on the result array: [ smaller than b , equal b, greater than b] + */ + void DNFSTestOddStrings() { + String[] strings = {"a", "d", "b", "s", "e"}; + String[] stringsResult = {"a", "b", "s", "e", "d"}; + DutchNationalFlagSort dutchNationalFlagSort = new DutchNationalFlagSort(); + dutchNationalFlagSort.sort(strings); + assertArrayEquals(strings, stringsResult); + } + + @Test + /* + 0 will be used as intended middle. + Partitions on the result array: [ smaller than 0 , equal 0, greater than 0] + */ + void DNFSTestOddMidGiven() { + Integer[] integers = {1, 3, 1, 4, 0}; + Integer[] integersResult = {0, 1, 4, 3, 1}; + DutchNationalFlagSort dutchNationalFlagSort = new DutchNationalFlagSort(); + dutchNationalFlagSort.sort(integers, 0); + assertArrayEquals(integers, integersResult); + } + + @Test + /* + 4 will be used as intended middle. + Partitions on the result array: [ smaller than 4 , equal 4, greater than 4] + */ + void DNFSTestEvenMidGiven() { + Integer[] integers = {8, 1, 3, 1, 4, 0}; + Integer[] integersResult = {0, 1, 3, 1, 4, 8}; + DutchNationalFlagSort dutchNationalFlagSort = new DutchNationalFlagSort(); + dutchNationalFlagSort.sort(integers, 4); + assertArrayEquals(integers, integersResult); + } + + @Test + /* + "s" will be used as intended middle. + Partitions on the result array: [ smaller than s , equal s, greater than s] + */ + void DNFSTestEvenStringsMidGiven() { + String[] strings = {"a", "d", "b", "s", "e", "e"}; + String[] stringsResult = {"a", "d", "b", "e", "e", "s"}; + DutchNationalFlagSort dutchNationalFlagSort = new DutchNationalFlagSort(); + dutchNationalFlagSort.sort(strings, "s"); + assertArrayEquals(strings, stringsResult); + } + + @Test + /* + "e" will be used as intended middle. + Partitions on the result array: [ smaller than e , equal e, greater than e] + */ + void DNFSTestOddStringsMidGiven() { + String[] strings = {"a", "d", "b", "s", "e"}; + String[] stringsResult = {"a", "d", "b", "e", "s"}; + DutchNationalFlagSort dutchNationalFlagSort = new DutchNationalFlagSort(); + dutchNationalFlagSort.sort(strings, "e"); + assertArrayEquals(strings, stringsResult); + } +}