Skip to content

Dutch national flag sort #3025

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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 extends Comparable<T>> T[] sort(T[] unsorted) {
return dutch_national_flag_sort(unsorted, unsorted[(int) Math.ceil((unsorted.length)/2.0) -1]);
}

public <T extends Comparable<T>> T[] sort(T[] unsorted, T intendedMiddle) {
return dutch_national_flag_sort(unsorted, intendedMiddle);
}

private <T extends Comparable<T>> 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;
}
}
112 changes: 112 additions & 0 deletions src/test/java/com/thealgorithms/sorts/DutchNationalFlagSortTest.java
Original file line number Diff line number Diff line change
@@ -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);
}
}