diff --git a/DIRECTORY.md b/DIRECTORY.md index ca30d65825..ec2b8f5dad 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -303,6 +303,7 @@ * [CombSort](Sorts/CombSort.js) * [CountingSort](Sorts/CountingSort.js) * [CycleSort](Sorts/CycleSort.js) + * [DutchNationalFlagSort](Sorts/DutchNationalFlagSort.js) * [FindSecondLargestElement](Sorts/FindSecondLargestElement.js) * [FisherYatesShuffle](Sorts/FisherYatesShuffle.js) * [FlashSort](Sorts/FlashSort.js) diff --git a/Sorts/DutchNationalFlagSort.js b/Sorts/DutchNationalFlagSort.js new file mode 100644 index 0000000000..d816d718c3 --- /dev/null +++ b/Sorts/DutchNationalFlagSort.js @@ -0,0 +1,33 @@ +/** + * @function dutchNationalFlagSort + * @description Dutch National Flag Sort is an algorithm to sort an array containing 0s, 1s, and 2s in linear time. + Time complexity of Dutch National Flag Sort Algorithm is O(n). + Auxiliary Space required for Dutch National Flag Sort Algorithm is O(1). + * @param {Integer[]} nums - Array of integers containing 0s, 1s, and 2s. + * @return {Integer[]} - Array of integers sorted in non-decreasing order. + * @see [Dutch National Flag Sort](https://en.wikipedia.org/wiki/Dutch_national_flag_problem) + */ +export function dutchNationalFlagSort (nums) { + let low = 0 + let mid = 0 + let high = nums.length - 1 + + while (mid <= high) { + switch (nums[mid]) { + case 0: + [nums[low], nums[mid]] = [nums[mid], nums[low]] + low++ + mid++ + break + case 1: + mid++ + break + case 2: + [nums[mid], nums[high]] = [nums[high], nums[mid]] + high-- + break + } + } + + return nums +} diff --git a/Sorts/test/DutchNationalFlagSort.test.js b/Sorts/test/DutchNationalFlagSort.test.js new file mode 100644 index 0000000000..ddb35c6171 --- /dev/null +++ b/Sorts/test/DutchNationalFlagSort.test.js @@ -0,0 +1,9 @@ +import { dutchNationalFlagSort } from '../DutchNationalFlagSort' + +describe('DutchNationalFlagSort', () => { + it('should sort arrays correctly', () => { + expect(dutchNationalFlagSort([2, 0, 2, 1, 1, 0])).toEqual([0, 0, 1, 1, 2, 2]) + expect(dutchNationalFlagSort([2, 1, 0])).toEqual([0, 1, 2]) + expect(dutchNationalFlagSort([1, 0, 0, 0, 1])).toEqual([0, 0, 0, 1, 1]) + }) +})