From 056b0cb973167b9162b5d364da5095eb223b626c Mon Sep 17 00:00:00 2001 From: Roman Kurnovskii Date: Fri, 3 Mar 2023 17:39:36 +0200 Subject: [PATCH 1/3] feat: add dutchNationalFlagSort implementation --- Sorts/DutchNationalFlagSort.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 Sorts/DutchNationalFlagSort.js diff --git a/Sorts/DutchNationalFlagSort.js b/Sorts/DutchNationalFlagSort.js new file mode 100644 index 0000000000..0be9f1fa8f --- /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; +} From 69fd9e0989f8d8006f42db683cb36221070ac6ae Mon Sep 17 00:00:00 2001 From: Roman Kurnovskii Date: Fri, 3 Mar 2023 17:50:50 +0200 Subject: [PATCH 2/3] fix: add test, fit code style --- Sorts/DutchNationalFlagSort.js | 28 ++++++++++++------------ Sorts/test/DutchNationalFlagSort.test.js | 9 ++++++++ 2 files changed, 23 insertions(+), 14 deletions(-) create mode 100644 Sorts/test/DutchNationalFlagSort.test.js diff --git a/Sorts/DutchNationalFlagSort.js b/Sorts/DutchNationalFlagSort.js index 0be9f1fa8f..d816d718c3 100644 --- a/Sorts/DutchNationalFlagSort.js +++ b/Sorts/DutchNationalFlagSort.js @@ -7,27 +7,27 @@ * @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; +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; + [nums[low], nums[mid]] = [nums[mid], nums[low]] + low++ + mid++ + break case 1: - mid++; - break; + mid++ + break case 2: - [nums[mid], nums[high]] = [nums[high], nums[mid]]; - high--; - break; + [nums[mid], nums[high]] = [nums[high], nums[mid]] + high-- + break } } - return nums; + 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]) + }) +}) From 8afef612d67b15fcfffc3b2b79e3b9bde5ebffab Mon Sep 17 00:00:00 2001 From: Roman Kurnovskii Date: Fri, 3 Mar 2023 18:00:25 +0200 Subject: [PATCH 3/3] fix: add link to directory.md --- DIRECTORY.md | 1 + 1 file changed, 1 insertion(+) 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)