From 2209bd81133777d23fe8a6b01102c261cdcbdb52 Mon Sep 17 00:00:00 2001 From: Hugo Venega Date: Thu, 18 Nov 2021 13:29:27 -0300 Subject: [PATCH 1/4] Add mergeSort --- src/sort/merge/mergeSort.spec.ts | 15 ++++++++++++ src/sort/merge/mergeSort.ts | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/sort/merge/mergeSort.spec.ts create mode 100644 src/sort/merge/mergeSort.ts diff --git a/src/sort/merge/mergeSort.spec.ts b/src/sort/merge/mergeSort.spec.ts new file mode 100644 index 0000000..3bcaa53 --- /dev/null +++ b/src/sort/merge/mergeSort.spec.ts @@ -0,0 +1,15 @@ +import mergeSort from './mergeSort'; + +describe('Merge sort', () => { + it('It should return an array sorted from lowest to highest', () => { + const arrayToSort = [43, 65, 44, 12, 67, 1, 9, 33, 21]; + const expectedArray = [1, 9, 12, 21, 33, 43, 44, 65, 67]; + expect(mergeSort(arrayToSort, (a, b): boolean => (a > b))).toEqual(expectedArray); + }); + + it('It should return an array sorted from highest to lowest', () => { + const arrayToSort = [43, 65, 44, 12, 67, 1, 9, 33, 21]; + const expectedArray = [67, 65, 44, 43, 33, 21, 12, 9, 1]; + expect(mergeSort(arrayToSort, (a, b): boolean => (a < b))).toEqual(expectedArray); + }); +}); diff --git a/src/sort/merge/mergeSort.ts b/src/sort/merge/mergeSort.ts new file mode 100644 index 0000000..eb79edd --- /dev/null +++ b/src/sort/merge/mergeSort.ts @@ -0,0 +1,39 @@ +interface CompareFunction { + (a: number, b: number): boolean; +} + +function merge(a: number[], b: number[], compareFunction: CompareFunction) { + const arrayC: number[] = []; + while (a[0] && b[0]) { + if (compareFunction(a[0], b[0])) { + arrayC.push((b).shift() as number); + } else { + arrayC.push(a.shift() as number); + } + } + while (a[0]) { + arrayC.push(a.shift() as number); + } + while (b[0]) { + arrayC.push(b.shift() as number); + } + return arrayC; +} + +export default function mergeSort(array: number[], compareFunction:CompareFunction): number[] { + const introducedArray = array; + if (introducedArray.length === 1) { + return introducedArray; + } + let arrayA: number[] = []; + for (let i = 0; i < Math.trunc(introducedArray.length / 2); i += 1) { + arrayA.push(introducedArray[i]); + } + arrayA = mergeSort(arrayA, compareFunction); + let arrayB: number[] = []; + for (let i = Math.trunc(introducedArray.length / 2); i < introducedArray.length; i += 1) { + arrayB.push(introducedArray[i]); + } + arrayB = mergeSort(arrayB, compareFunction); + return merge(arrayA, arrayB, compareFunction); +} From 4c09cd998af4b567723661a6286f9c17595bed0e Mon Sep 17 00:00:00 2001 From: Hugo Venega Date: Thu, 18 Nov 2021 15:16:04 -0300 Subject: [PATCH 2/4] Fix tests titles of mergeSort function --- src/sort/merge/mergeSort.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sort/merge/mergeSort.spec.ts b/src/sort/merge/mergeSort.spec.ts index 3bcaa53..14c2acd 100644 --- a/src/sort/merge/mergeSort.spec.ts +++ b/src/sort/merge/mergeSort.spec.ts @@ -1,13 +1,13 @@ import mergeSort from './mergeSort'; describe('Merge sort', () => { - it('It should return an array sorted from lowest to highest', () => { + it('should return an array sorted from lowest to highest', () => { const arrayToSort = [43, 65, 44, 12, 67, 1, 9, 33, 21]; const expectedArray = [1, 9, 12, 21, 33, 43, 44, 65, 67]; expect(mergeSort(arrayToSort, (a, b): boolean => (a > b))).toEqual(expectedArray); }); - it('It should return an array sorted from highest to lowest', () => { + it('should return an array sorted from highest to lowest', () => { const arrayToSort = [43, 65, 44, 12, 67, 1, 9, 33, 21]; const expectedArray = [67, 65, 44, 43, 33, 21, 12, 9, 1]; expect(mergeSort(arrayToSort, (a, b): boolean => (a < b))).toEqual(expectedArray); From d30026ef705c58364d70dc5265a9b6a17637a60c Mon Sep 17 00:00:00 2001 From: Hugo Venega Date: Thu, 18 Nov 2021 15:22:29 -0300 Subject: [PATCH 3/4] Separate functions of MergeSort tests --- src/sort/merge/mergeSort.spec.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/sort/merge/mergeSort.spec.ts b/src/sort/merge/mergeSort.spec.ts index 14c2acd..9ebd661 100644 --- a/src/sort/merge/mergeSort.spec.ts +++ b/src/sort/merge/mergeSort.spec.ts @@ -1,15 +1,18 @@ import mergeSort from './mergeSort'; +const sortLowToHigh = (a: number, b: number): boolean => (a > b); +const sortHighToLow = (a: number, b: number): boolean => (a < b); + describe('Merge sort', () => { it('should return an array sorted from lowest to highest', () => { const arrayToSort = [43, 65, 44, 12, 67, 1, 9, 33, 21]; const expectedArray = [1, 9, 12, 21, 33, 43, 44, 65, 67]; - expect(mergeSort(arrayToSort, (a, b): boolean => (a > b))).toEqual(expectedArray); + expect(mergeSort(arrayToSort, sortLowToHigh)).toEqual(expectedArray); }); it('should return an array sorted from highest to lowest', () => { const arrayToSort = [43, 65, 44, 12, 67, 1, 9, 33, 21]; const expectedArray = [67, 65, 44, 43, 33, 21, 12, 9, 1]; - expect(mergeSort(arrayToSort, (a, b): boolean => (a < b))).toEqual(expectedArray); + expect(mergeSort(arrayToSort, sortHighToLow)).toEqual(expectedArray); }); }); From d02e4148227c26ca5b103d6dcdf4d6fb1653d29c Mon Sep 17 00:00:00 2001 From: Hugo Venega Date: Thu, 18 Nov 2021 16:07:21 -0300 Subject: [PATCH 4/4] Add tests for MergeSort and fix when array is empty --- src/sort/merge/mergeSort.spec.ts | 21 +++++++++++++++++++++ src/sort/merge/mergeSort.ts | 3 +++ 2 files changed, 24 insertions(+) diff --git a/src/sort/merge/mergeSort.spec.ts b/src/sort/merge/mergeSort.spec.ts index 9ebd661..889bf85 100644 --- a/src/sort/merge/mergeSort.spec.ts +++ b/src/sort/merge/mergeSort.spec.ts @@ -4,6 +4,27 @@ const sortLowToHigh = (a: number, b: number): boolean => (a > b); const sortHighToLow = (a: number, b: number): boolean => (a < b); describe('Merge sort', () => { + it('should return an empty array when the array for sorting is empty', () => { + const arrayToSort: number[] = []; + const expectedArray: number[] = []; + expect(mergeSort(arrayToSort, sortLowToHigh)) + .toEqual(expectedArray); + }); + + it('should return an array with the element', () => { + const arrayToSort: number[] = [14]; + const expectedArray: number[] = [14]; + expect(mergeSort(arrayToSort, sortLowToHigh)) + .toEqual(expectedArray); + }); + + it('should return an array with two elements sorted from lowest to highest', () => { + const arrayToSort = [65, 43]; + const expectedArray = [43, 65]; + expect(mergeSort(arrayToSort, sortLowToHigh)) + .toEqual(expectedArray); + }); + it('should return an array sorted from lowest to highest', () => { const arrayToSort = [43, 65, 44, 12, 67, 1, 9, 33, 21]; const expectedArray = [1, 9, 12, 21, 33, 43, 44, 65, 67]; diff --git a/src/sort/merge/mergeSort.ts b/src/sort/merge/mergeSort.ts index eb79edd..616d457 100644 --- a/src/sort/merge/mergeSort.ts +++ b/src/sort/merge/mergeSort.ts @@ -21,6 +21,9 @@ function merge(a: number[], b: number[], compareFunction: CompareFunction) { } export default function mergeSort(array: number[], compareFunction:CompareFunction): number[] { + if (!array.length) { + return []; + } const introducedArray = array; if (introducedArray.length === 1) { return introducedArray;