From ec8ab7abb0a6fa52cb2ef19139a8012a26b4450f Mon Sep 17 00:00:00 2001 From: tamaf96 Date: Sun, 3 Dec 2023 15:01:23 +0100 Subject: [PATCH 1/5] feat: add treesort algorithm --- DIRECTORY.md | 1 + sorts/test/tree_sort.test.ts | 15 +++++++++ sorts/tree_sort.ts | 60 ++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 sorts/test/tree_sort.test.ts create mode 100644 sorts/tree_sort.ts diff --git a/DIRECTORY.md b/DIRECTORY.md index 92c92ff3..de534ede 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -166,3 +166,4 @@ * [Selection Sort](https://github.com/TheAlgorithms/TypeScript/blob/HEAD/sorts/selection_sort.ts) * [Shell Sort](https://github.com/TheAlgorithms/TypeScript/blob/HEAD/sorts/shell_sort.ts) * [Swap Sort](https://github.com/TheAlgorithms/TypeScript/blob/HEAD/sorts/swap_sort.ts) + * [Tree Sort](https://github.com/TheAlgorithms/TypeScript/blob/HEAD/sorts/tree_sort.ts) diff --git a/sorts/test/tree_sort.test.ts b/sorts/test/tree_sort.test.ts new file mode 100644 index 00000000..9b825ff4 --- /dev/null +++ b/sorts/test/tree_sort.test.ts @@ -0,0 +1,15 @@ +import { treeSort } from "../tree_sort"; + +describe('TreeSort', () => { + it.each([ + { input: [], expected: [] }, + { input: [1, 18, 3, 4, -5, 6], expected: [-5, 1, 3, 4, 6, 18] }, + { input: [7, 6, 2, 5.2, 11, 0], expected: [0, 2, 5.2, 6, 7, 11] }, + { input: [3, 3, -2, 1, 0], expected: [-2, 0, 1, 3, 3] }, + { input: [3, 0, -2.4, 1, 9, 8, -7, 6], expected: [-7, -2.4, 0, 1, 3, 6, 8, 9] }, + { input: [1, 0, -14, 0, 8.6, 6, 8], expected: [-14, 0, 0, 1, 6, 8, 8.6] }, + ])('should work for given input', ({ input, expected }) => { + expect(treeSort(input)).toEqual(expected); + }); + }); + \ No newline at end of file diff --git a/sorts/tree_sort.ts b/sorts/tree_sort.ts new file mode 100644 index 00000000..48e1288c --- /dev/null +++ b/sorts/tree_sort.ts @@ -0,0 +1,60 @@ +/** + * @author : tamaf96 + * @description + * Tree Sort sorts a list by building a binary search tree and traverse is. + * @param {number[]} arr - Array of numbers + * @return {number[]} - The sorted Array. + * @see + */ + +type BinaryTree = { + leftSubTree: BinaryTree | null; + node: T | null; + rightSubTree: BinaryTree | null; +}; + +export const treeSort = (arr: number[]): number[] => { + const searchTree = emptyTree(); + for (const item of arr) { + insert(searchTree, item); + } + return inOrder(searchTree); +}; + +const emptyTree = (): BinaryTree => ({ + leftSubTree: null, + node: null, + rightSubTree: null, +}); + +const insert = (searchTree: BinaryTree, item: number): void => { + if (searchTree.node === null) { + searchTree.node = item; + } else { + if (item < searchTree.node) { + if (searchTree.leftSubTree === null) { + searchTree.leftSubTree = emptyTree(); + } + insert(searchTree.leftSubTree, item); + } else { + if (searchTree.rightSubTree === null) { + searchTree.rightSubTree = emptyTree(); + } + insert(searchTree.rightSubTree, item); + } + } +}; + +const inOrder = ( + searchTree: BinaryTree | null, + arr: number[] = [], +): number[] => { + if (searchTree === null || searchTree.node === null) { + return []; + } else { + inOrder(searchTree.leftSubTree, arr); + arr.push(searchTree.node); + inOrder(searchTree.rightSubTree, arr); + } + return arr; +}; From c24aa2068c7cabae13a0e2dda704a411fda15f93 Mon Sep 17 00:00:00 2001 From: tamaf96 Date: Sun, 10 Dec 2023 12:18:18 +0100 Subject: [PATCH 2/5] use existing data structure --- sorts/tree_sort.ts | 50 ++++------------------------------------------ 1 file changed, 4 insertions(+), 46 deletions(-) diff --git a/sorts/tree_sort.ts b/sorts/tree_sort.ts index 48e1288c..9f30a769 100644 --- a/sorts/tree_sort.ts +++ b/sorts/tree_sort.ts @@ -7,54 +7,12 @@ * @see */ -type BinaryTree = { - leftSubTree: BinaryTree | null; - node: T | null; - rightSubTree: BinaryTree | null; -}; +import { BinarySearchTree } from "../data_structures/tree/binary_search_tree"; export const treeSort = (arr: number[]): number[] => { - const searchTree = emptyTree(); + const searchTree = new BinarySearchTree(); for (const item of arr) { - insert(searchTree, item); - } - return inOrder(searchTree); -}; - -const emptyTree = (): BinaryTree => ({ - leftSubTree: null, - node: null, - rightSubTree: null, -}); - -const insert = (searchTree: BinaryTree, item: number): void => { - if (searchTree.node === null) { - searchTree.node = item; - } else { - if (item < searchTree.node) { - if (searchTree.leftSubTree === null) { - searchTree.leftSubTree = emptyTree(); - } - insert(searchTree.leftSubTree, item); - } else { - if (searchTree.rightSubTree === null) { - searchTree.rightSubTree = emptyTree(); - } - insert(searchTree.rightSubTree, item); - } - } -}; - -const inOrder = ( - searchTree: BinaryTree | null, - arr: number[] = [], -): number[] => { - if (searchTree === null || searchTree.node === null) { - return []; - } else { - inOrder(searchTree.leftSubTree, arr); - arr.push(searchTree.node); - inOrder(searchTree.rightSubTree, arr); + searchTree.insert(item); } - return arr; + return searchTree.inOrderTraversal(); }; From d75a181fa0d746e495be99107d399f7bf3668841 Mon Sep 17 00:00:00 2001 From: tamaf96 Date: Sun, 10 Dec 2023 21:21:05 +0100 Subject: [PATCH 3/5] make generic and add tests for string and date --- sorts/test/tree_sort.test.ts | 40 ++++++++++++++++++++++++++---------- sorts/tree_sort.ts | 8 ++++---- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/sorts/test/tree_sort.test.ts b/sorts/test/tree_sort.test.ts index 9b825ff4..07cbca56 100644 --- a/sorts/test/tree_sort.test.ts +++ b/sorts/test/tree_sort.test.ts @@ -1,15 +1,33 @@ import { treeSort } from "../tree_sort"; -describe('TreeSort', () => { - it.each([ - { input: [], expected: [] }, - { input: [1, 18, 3, 4, -5, 6], expected: [-5, 1, 3, 4, 6, 18] }, - { input: [7, 6, 2, 5.2, 11, 0], expected: [0, 2, 5.2, 6, 7, 11] }, - { input: [3, 3, -2, 1, 0], expected: [-2, 0, 1, 3, 3] }, - { input: [3, 0, -2.4, 1, 9, 8, -7, 6], expected: [-7, -2.4, 0, 1, 3, 6, 8, 9] }, - { input: [1, 0, -14, 0, 8.6, 6, 8], expected: [-14, 0, 0, 1, 6, 8, 8.6] }, - ])('should work for given input', ({ input, expected }) => { - expect(treeSort(input)).toEqual(expected); - }); +describe('TreeSort (numbers)', () => { + it.each([ + { input: [], expected: [] }, + { input: [1, 18, 3, 4, -5, 6], expected: [-5, 1, 3, 4, 6, 18] }, + { input: [7, 6, 2, 5.2, 11, 0], expected: [0, 2, 5.2, 6, 7, 11] }, + { input: [3, 3, -2, 1, 0], expected: [-2, 0, 1, 3, 3] }, + { input: [3, 0, -2.4, 1, 9, 8, -7, 6], expected: [-7, -2.4, 0, 1, 3, 6, 8, 9] }, + { input: [1, 0, -14, 0, 8.6, 6, 8], expected: [-14, 0, 0, 1, 6, 8, 8.6] }, + ])('should work for given input', ({ input, expected }) => { + expect(treeSort(input)).toEqual(expected); }); +}); + +describe('TreeSort (strings)', () => { + it.each([ + { input: ["e","egr","sse","aas", "as","abs"], expected: ["aas","abs","as","e","egr","sse"] }, + ])('should work for given input', ({ input, expected }) => { + expect(treeSort(input)).toEqual(expected); + }); +}); + +describe('TreeSort (dates)', () => { + it.each([ + { input: [new Date("2019-01-16"),new Date("2019-01-01"),new Date("2022-05-20")], expected: [new Date("2019-01-01"),new Date("2019-01-16"),new Date("2022-05-20")] }, + ])('should work for given input', ({ input, expected }) => { + expect(treeSort(input)).toEqual(expected); + }); +}); + + \ No newline at end of file diff --git a/sorts/tree_sort.ts b/sorts/tree_sort.ts index 9f30a769..9403d18e 100644 --- a/sorts/tree_sort.ts +++ b/sorts/tree_sort.ts @@ -2,15 +2,15 @@ * @author : tamaf96 * @description * Tree Sort sorts a list by building a binary search tree and traverse is. - * @param {number[]} arr - Array of numbers - * @return {number[]} - The sorted Array. + * @param {T[]} arr - Array of comparible items + * @return {T[]} - The sorted Array. * @see */ import { BinarySearchTree } from "../data_structures/tree/binary_search_tree"; -export const treeSort = (arr: number[]): number[] => { - const searchTree = new BinarySearchTree(); +export const treeSort = (arr: T[]): T[] => { + const searchTree = new BinarySearchTree(); for (const item of arr) { searchTree.insert(item); } From 165b63ab2cf6b68a4614293cfc5ad5754bc236d1 Mon Sep 17 00:00:00 2001 From: tamaf96 Date: Sun, 10 Dec 2023 21:21:32 +0100 Subject: [PATCH 4/5] fix typo --- sorts/tree_sort.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorts/tree_sort.ts b/sorts/tree_sort.ts index 9403d18e..38cae037 100644 --- a/sorts/tree_sort.ts +++ b/sorts/tree_sort.ts @@ -1,7 +1,7 @@ /** * @author : tamaf96 * @description - * Tree Sort sorts a list by building a binary search tree and traverse is. + * Tree Sort sorts a list by building a binary search tree and traversing it. * @param {T[]} arr - Array of comparible items * @return {T[]} - The sorted Array. * @see From 5e3f32779907e7a5c7721e6dc252cac4e7902dbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Sun, 10 Dec 2023 22:50:55 +0100 Subject: [PATCH 5/5] Fix typo --- sorts/tree_sort.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorts/tree_sort.ts b/sorts/tree_sort.ts index 38cae037..e4369e52 100644 --- a/sorts/tree_sort.ts +++ b/sorts/tree_sort.ts @@ -2,7 +2,7 @@ * @author : tamaf96 * @description * Tree Sort sorts a list by building a binary search tree and traversing it. - * @param {T[]} arr - Array of comparible items + * @param {T[]} arr - Array of comparable items * @return {T[]} - The sorted Array. * @see */