diff --git a/algorithms-sorting-2/.gitignore b/algorithms-sorting-2/.gitignore
new file mode 100644
index 0000000000..30b2b7442c
--- /dev/null
+++ b/algorithms-sorting-2/.gitignore
@@ -0,0 +1,4 @@
+/target/
+.settings/
+.classpath
+.project
\ No newline at end of file
diff --git a/algorithms-sorting-2/pom.xml b/algorithms-sorting-2/pom.xml
new file mode 100644
index 0000000000..d862c91430
--- /dev/null
+++ b/algorithms-sorting-2/pom.xml
@@ -0,0 +1,64 @@
+
+ 4.0.0
+ algorithms-sorting-2
+ 0.0.1-SNAPSHOT
+ algorithms-sorting-2
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.apache.commons
+ commons-math3
+ ${commons-math3.version}
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit-jupiter-api.version}
+ test
+
+
+ org.assertj
+ assertj-core
+ ${org.assertj.core.version}
+ test
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+
+
+
+
+
+ 3.6.1
+ 3.9.0
+ 1.11
+ 5.3.1
+
+
+
\ No newline at end of file
diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java
new file mode 100644
index 0000000000..d005f2654c
--- /dev/null
+++ b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java
@@ -0,0 +1,66 @@
+package com.baeldung.algorithms.quicksort;
+
+import static com.baeldung.algorithms.quicksort.SortingUtils.swap;
+
+public class BentleyMcIlroyPartioning {
+
+ public static Partition partition(int input[], int begin, int end) {
+ int left = begin, right = end;
+ int leftEqualKeysCount = 0, rightEqualKeysCount = 0;
+
+ int partitioningValue = input[end];
+
+ while (true) {
+ while (input[left] < partitioningValue)
+ left++;
+
+ while (input[right] > partitioningValue) {
+ if (right == begin)
+ break;
+ right--;
+ }
+
+ if (left == right && input[left] == partitioningValue) {
+ swap(input, begin + leftEqualKeysCount, left);
+ leftEqualKeysCount++;
+ left++;
+ }
+
+ if (left >= right) {
+ break;
+ }
+
+ swap(input, left, right);
+
+ if (input[left] == partitioningValue) {
+ swap(input, begin + leftEqualKeysCount, left);
+ leftEqualKeysCount++;
+ }
+
+ if (input[right] == partitioningValue) {
+ swap(input, right, end - rightEqualKeysCount);
+ rightEqualKeysCount++;
+ }
+ left++; right--;
+ }
+ right = left - 1;
+ for (int k = begin; k < begin + leftEqualKeysCount; k++, right--) {
+ if (right >= begin + leftEqualKeysCount)
+ swap(input, k, right);
+ }
+ for (int k = end; k > end - rightEqualKeysCount; k--, left++) {
+ if (left <= end - rightEqualKeysCount)
+ swap(input, left, k);
+ }
+ return new Partition(right + 1, left - 1);
+ }
+
+ public static void quicksort(int input[], int begin, int end) {
+ if (end <= begin)
+ return;
+ Partition middlePartition = partition(input, begin, end);
+ quicksort(input, begin, middlePartition.getLeft() - 1);
+ quicksort(input, middlePartition.getRight() + 1, end);
+ }
+
+}
diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java
new file mode 100644
index 0000000000..e868cf0e2e
--- /dev/null
+++ b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java
@@ -0,0 +1,38 @@
+package com.baeldung.algorithms.quicksort;
+
+import static com.baeldung.algorithms.quicksort.SortingUtils.compare;
+import static com.baeldung.algorithms.quicksort.SortingUtils.swap;
+
+public class DutchNationalFlagPartioning {
+
+ public static Partition partition(int[] a, int begin, int end) {
+ int lt = begin, current = begin, gt = end;
+ int partitioningValue = a[begin];
+
+ while (current <= gt) {
+ int compareCurrent = compare(a[current], partitioningValue);
+ switch (compareCurrent) {
+ case -1:
+ swap(a, current++, lt++);
+ break;
+ case 0:
+ current++;
+ break;
+ case 1:
+ swap(a, current, gt--);
+ break;
+ }
+ }
+ return new Partition(lt, gt);
+ }
+
+ public static void quicksort(int[] input, int begin, int end) {
+ if (end <= begin)
+ return;
+
+ Partition middlePartition = partition(input, begin, end);
+
+ quicksort(input, begin, middlePartition.getLeft() - 1);
+ quicksort(input, middlePartition.getRight() + 1, end);
+ }
+}
diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java
new file mode 100644
index 0000000000..29812f2720
--- /dev/null
+++ b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java
@@ -0,0 +1,29 @@
+package com.baeldung.algorithms.quicksort;
+
+public class Partition {
+ private int left;
+ private int right;
+
+ public Partition(int left, int right) {
+ super();
+ this.left = left;
+ this.right = right;
+ }
+
+ public int getLeft() {
+ return left;
+ }
+
+ public void setLeft(int left) {
+ this.left = left;
+ }
+
+ public int getRight() {
+ return right;
+ }
+
+ public void setRight(int right) {
+ this.right = right;
+ }
+
+}
diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java
new file mode 100644
index 0000000000..ac1aa5e8ee
--- /dev/null
+++ b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java
@@ -0,0 +1,32 @@
+package com.baeldung.algorithms.quicksort;
+
+public class SortingUtils {
+
+ public static void swap(int[] array, int position1, int position2) {
+ if (position1 != position2) {
+ int temp = array[position1];
+ array[position1] = array[position2];
+ array[position2] = temp;
+ }
+ }
+
+ public static int compare(int num1, int num2) {
+ if (num1 > num2)
+ return 1;
+ else if (num1 < num2)
+ return -1;
+ else
+ return 0;
+ }
+
+ public static void printArray(int[] array) {
+ if (array == null) {
+ return;
+ }
+ for (int e : array) {
+ System.out.print(e + " ");
+ }
+ System.out.println();
+ }
+
+}
diff --git a/algorithms-sorting-2/src/main/resources/logback.xml b/algorithms-sorting-2/src/main/resources/logback.xml
new file mode 100644
index 0000000000..26beb6d5b4
--- /dev/null
+++ b/algorithms-sorting-2/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java b/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java
new file mode 100644
index 0000000000..847f7f8acb
--- /dev/null
+++ b/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.algorithms.quicksort;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class BentleyMcilroyPartitioningUnitTest {
+
+ @Test
+ public void given_IntegerArray_whenSortedWithBentleyMcilroyPartitioning_thenGetSortedArray() {
+ int[] actual = {3, 2, 2, 2, 3, 7, 7, 3, 2, 2, 7, 3, 3};
+ int[] expected = {2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 7, 7, 7};
+ BentleyMcIlroyPartioning.quicksort(actual, 0, actual.length - 1);
+ Assert.assertArrayEquals(expected, actual);
+ }
+
+}
diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java b/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java
new file mode 100644
index 0000000000..a8e27253cc
--- /dev/null
+++ b/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.algorithms.quicksort;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class DNFThreeWayQuickSortUnitTest {
+
+ @Test
+ public void givenIntegerArray_whenSortedWithThreeWayQuickSort_thenGetSortedArray() {
+ int[] actual = {3, 5, 5, 5, 3, 7, 7, 3, 5, 5, 7, 3, 3};
+ int[] expected = {3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 7, 7, 7};
+ DutchNationalFlagPartioning.quicksort(actual, 0, actual.length - 1);
+ Assert.assertArrayEquals(expected, actual);
+ }
+}
diff --git a/pom.xml b/pom.xml
index c28fcdb273..71e5d21b02 100644
--- a/pom.xml
+++ b/pom.xml
@@ -341,6 +341,7 @@
algorithms-miscellaneous-4
algorithms-miscellaneous-5
algorithms-sorting
+ algorithms-sorting-2
algorithms-searching
animal-sniffer-mvn-plugin
annotations
@@ -985,6 +986,7 @@
algorithms-miscellaneous-4
algorithms-miscellaneous-5
algorithms-sorting
+ algorithms-sorting-2
algorithms-searching
animal-sniffer-mvn-plugin
annotations