Skip to content

Commit 5a910de

Browse files
authored
Refactoring (#11)
* Use boolean to determine if swaps were made * Refactor to export quicksort directly * Refactored tests * Export named functions instead of lambdas * Updated npm keywords * Refactored merge function
1 parent 35bcd19 commit 5a910de

File tree

7 files changed

+44
-41
lines changed

7 files changed

+44
-41
lines changed

package.json

+7-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,13 @@
2121
},
2222
"keywords": [
2323
"sorting",
24-
"algorithms"
24+
"algorithms",
25+
"sort",
26+
"bubble sort",
27+
"insertion sort",
28+
"merge sort",
29+
"quicksort",
30+
"selection sort"
2531
],
2632
"author": "jasonheecs",
2733
"license": "MIT",

src/bubble-sort.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ import {swap} from './helper.js';
66
* @param {Array} elements
77
* @return {Array}
88
*/
9-
export default (elements) => {
10-
let swapCounter = -1;
9+
export default function bubbleSort (elements) {
10+
let done = false;
1111
let limit = elements.length - 1;
1212

13-
while (swapCounter !== 0) {
14-
swapCounter = 0;
13+
while (!done) {
14+
done = true;
1515

1616
for (let i = 0; i < limit; i++) {
1717
if (elements[i] > elements[i + 1]) {
1818
swap(elements, i, i + 1);
19-
swapCounter++;
19+
done = false;
2020
}
2121
}
2222

src/insertion-sort.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* @param {Array} elements
55
* @return {Array}
66
*/
7-
export default (elements) => {
7+
export default function insertionSort (elements) {
88
let valueToInsert;
99
let index;
1010

src/merge-sort.js

+4-5
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,12 @@ function merge (left, right) {
1111
let j = 0;
1212

1313
while (i < left.length || j < right.length) {
14-
if (i < left.length && j < right.length) {
15-
if (left[i] < right[j]) {
16-
mergedArr.push(left[i++]);
17-
} else {
14+
if (i < left.length) {
15+
if (j < right.length && right[j] < left[i]) {
1816
mergedArr.push(right[j++]);
17+
continue;
1918
}
20-
} else if (i < left.length) {
19+
2120
mergedArr.push(left[i++]);
2221
} else {
2322
mergedArr.push(right[j++]);

src/quicksort.js

+9-21
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,6 @@
22

33
import {swap} from './helper.js';
44

5-
/**
6-
* @param {Array} elements
7-
* @param {number} left
8-
* @param {number} right
9-
* @return {Array}
10-
*/
11-
function quickSort (elements, left, right) {
12-
if (left < right) {
13-
let partitionIndex = partition(elements, left, right);
14-
15-
quickSort(elements, left, partitionIndex - 1);
16-
quickSort(elements, partitionIndex + 1, right);
17-
}
18-
19-
return elements;
20-
}
21-
225
/**
236
* @param {Array} elements
247
* @param {number} left
@@ -42,12 +25,17 @@ function partition (elements, left, right) {
4225

4326
/**
4427
* @param {Array} elements
28+
* @param {number} left
29+
* @param {number} right
4530
* @return {Array}
4631
*/
47-
export default (elements) => {
48-
if (elements.length < 2) {
49-
return elements;
32+
export default function quickSort (elements, left = 0, right = (elements.length - 1)) {
33+
if (elements.length > 1 && left < right) {
34+
let partitionIndex = partition(elements, left, right);
35+
36+
quickSort(elements, left, partitionIndex - 1);
37+
quickSort(elements, partitionIndex + 1, right);
5038
}
5139

52-
return quickSort(elements, 0, elements.length - 1);
40+
return elements;
5341
};

src/selection-sort.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ function findSmallestElementIndex (elements, startIndex) {
2525
* @param {Array} elements
2626
* @return {Array}
2727
*/
28-
export default (elements) => {
28+
export default function selectionSort (elements) {
2929
elements.forEach((el, index) => {
3030
let smallestElementIndex = findSmallestElementIndex(elements, index);
3131

test/common.js

+17-7
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,7 @@ const expect = (require('chai')).expect;
88
* @return {boolean}
99
*/
1010
function arrayIsSorted (arr) {
11-
return arr.every((el, index) => {
12-
if (index < arr.length - 1) {
13-
return (el <= arr[index + 1]);
14-
} else {
15-
return true;
16-
}
17-
});
11+
return arr.every((el, index) => el <= arr[index + 1] || index >= arr.length - 1);
1812
}
1913

2014
/**
@@ -83,4 +77,20 @@ export default (algoToTest) => {
8377
it('with empty array', testFunc([], algoToTest, (testItem) => {
8478
expect(testItem).to.deep.equal([]);
8579
}));
80+
81+
it('with already sorted array', testFunc([1, 2, 3, 4, 5], algoToTest, (testItem) => {
82+
expect(arrayIsSorted(testItem)).to.be.true;
83+
}));
84+
85+
it('with sorted array in reverse order', testFunc([5, 4, 3, 2, 1], algoToTest, (testItem) => {
86+
expect(arrayIsSorted(testItem)).to.be.true;
87+
}));
88+
89+
it('with negative values', testFunc([-5, 2, -3, 1, 0], algoToTest, (testItem) => {
90+
expect(arrayIsSorted(testItem)).to.be.true;
91+
}));
92+
93+
it('with repeated values', testFunc([1, 1, 1, 1, 1], algoToTest, (testItem) => {
94+
expect(arrayIsSorted(testItem)).to.be.true;
95+
}));
8696
};

0 commit comments

Comments
 (0)