From e15867a65e9ace91ed8a33df359f07f9ccd5cdc6 Mon Sep 17 00:00:00 2001 From: Jason Hee Date: Sun, 29 Apr 2018 20:34:29 +0800 Subject: [PATCH 1/6] Use boolean to determine if swaps were made --- src/bubble-sort.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bubble-sort.js b/src/bubble-sort.js index 8d3dad9..d5c2587 100644 --- a/src/bubble-sort.js +++ b/src/bubble-sort.js @@ -7,16 +7,16 @@ import {swap} from './helper.js'; * @return {Array} */ export default (elements) => { - let swapCounter = -1; + let done = false; let limit = elements.length - 1; - while (swapCounter !== 0) { - swapCounter = 0; + while (!done) { + done = true; for (let i = 0; i < limit; i++) { if (elements[i] > elements[i + 1]) { swap(elements, i, i + 1); - swapCounter++; + done = false; } } From b139ab726562d2816bc7fea18cde423328589d7c Mon Sep 17 00:00:00 2001 From: Jason Hee Date: Sun, 29 Apr 2018 21:20:06 +0800 Subject: [PATCH 2/6] Refactor to export quicksort directly --- src/quicksort.js | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/src/quicksort.js b/src/quicksort.js index 247ecf6..7f496fd 100644 --- a/src/quicksort.js +++ b/src/quicksort.js @@ -2,23 +2,6 @@ import {swap} from './helper.js'; -/** - * @param {Array} elements - * @param {number} left - * @param {number} right - * @return {Array} - */ -function quickSort (elements, left, right) { - if (left < right) { - let partitionIndex = partition(elements, left, right); - - quickSort(elements, left, partitionIndex - 1); - quickSort(elements, partitionIndex + 1, right); - } - - return elements; -} - /** * @param {Array} elements * @param {number} left @@ -42,12 +25,17 @@ function partition (elements, left, right) { /** * @param {Array} elements + * @param {number} left + * @param {number} right * @return {Array} */ -export default (elements) => { - if (elements.length < 2) { - return elements; +export default function quickSort (elements, left = 0, right = (elements.length - 1)) { + if (elements.length > 1 && left < right) { + let partitionIndex = partition(elements, left, right); + + quickSort(elements, left, partitionIndex - 1); + quickSort(elements, partitionIndex + 1, right); } - return quickSort(elements, 0, elements.length - 1); + return elements; }; From 57b70f881929363e87121f86aa7d5e374983dfaf Mon Sep 17 00:00:00 2001 From: Jason Hee Date: Sun, 29 Apr 2018 21:32:02 +0800 Subject: [PATCH 3/6] Refactored tests --- test/common.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/test/common.js b/test/common.js index 2615c85..70b5706 100644 --- a/test/common.js +++ b/test/common.js @@ -8,13 +8,7 @@ const expect = (require('chai')).expect; * @return {boolean} */ function arrayIsSorted (arr) { - return arr.every((el, index) => { - if (index < arr.length - 1) { - return (el <= arr[index + 1]); - } else { - return true; - } - }); + return arr.every((el, index) => el <= arr[index + 1] || index >= arr.length - 1); } /** @@ -83,4 +77,20 @@ export default (algoToTest) => { it('with empty array', testFunc([], algoToTest, (testItem) => { expect(testItem).to.deep.equal([]); })); + + it('with already sorted array', testFunc([1, 2, 3, 4, 5], algoToTest, (testItem) => { + expect(arrayIsSorted(testItem)).to.be.true; + })); + + it('with sorted array in reverse order', testFunc([5, 4, 3, 2, 1], algoToTest, (testItem) => { + expect(arrayIsSorted(testItem)).to.be.true; + })); + + it('with negative values', testFunc([-5, 2, -3, 1, 0], algoToTest, (testItem) => { + expect(arrayIsSorted(testItem)).to.be.true; + })); + + it('with repeated values', testFunc([1, 1, 1, 1, 1], algoToTest, (testItem) => { + expect(arrayIsSorted(testItem)).to.be.true; + })); }; From 834df8f25991eb61756ef8350000e62d043c21f8 Mon Sep 17 00:00:00 2001 From: Jason Hee Date: Sun, 29 Apr 2018 21:34:04 +0800 Subject: [PATCH 4/6] Export named functions instead of lambdas --- src/bubble-sort.js | 2 +- src/insertion-sort.js | 2 +- src/selection-sort.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bubble-sort.js b/src/bubble-sort.js index d5c2587..3eacefe 100644 --- a/src/bubble-sort.js +++ b/src/bubble-sort.js @@ -6,7 +6,7 @@ import {swap} from './helper.js'; * @param {Array} elements * @return {Array} */ -export default (elements) => { +export default function bubbleSort (elements) { let done = false; let limit = elements.length - 1; diff --git a/src/insertion-sort.js b/src/insertion-sort.js index ea3bf9f..59035a4 100644 --- a/src/insertion-sort.js +++ b/src/insertion-sort.js @@ -4,7 +4,7 @@ * @param {Array} elements * @return {Array} */ -export default (elements) => { +export default function insertionSort (elements) { let valueToInsert; let index; diff --git a/src/selection-sort.js b/src/selection-sort.js index 38ab6d8..cbb7fa9 100644 --- a/src/selection-sort.js +++ b/src/selection-sort.js @@ -25,7 +25,7 @@ function findSmallestElementIndex (elements, startIndex) { * @param {Array} elements * @return {Array} */ -export default (elements) => { +export default function selectionSort (elements) { elements.forEach((el, index) => { let smallestElementIndex = findSmallestElementIndex(elements, index); From c1b3673a5094a448d9394c73679d5c677c58f39f Mon Sep 17 00:00:00 2001 From: Jason Hee Date: Sun, 29 Apr 2018 21:38:24 +0800 Subject: [PATCH 5/6] Updated npm keywords --- package.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f33de24..2834d3a 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,13 @@ }, "keywords": [ "sorting", - "algorithms" + "algorithms", + "sort", + "bubble sort", + "insertion sort", + "merge sort", + "quicksort", + "selection sort" ], "author": "jasonheecs", "license": "MIT", From 7497e1173a3b68394ded805fb3f8ceac680bd0b1 Mon Sep 17 00:00:00 2001 From: Jason Hee Date: Sun, 29 Apr 2018 22:25:19 +0800 Subject: [PATCH 6/6] Refactored merge function --- src/merge-sort.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/merge-sort.js b/src/merge-sort.js index f04ded2..7db8aa9 100644 --- a/src/merge-sort.js +++ b/src/merge-sort.js @@ -11,13 +11,12 @@ function merge (left, right) { let j = 0; while (i < left.length || j < right.length) { - if (i < left.length && j < right.length) { - if (left[i] < right[j]) { - mergedArr.push(left[i++]); - } else { + if (i < left.length) { + if (j < right.length && right[j] < left[i]) { mergedArr.push(right[j++]); + continue; } - } else if (i < left.length) { + mergedArr.push(left[i++]); } else { mergedArr.push(right[j++]);