diff --git a/src/algorithms/sorting/quick-sort/QuickSort.js b/src/algorithms/sorting/quick-sort/QuickSort.js index 1c63c86e8b..026006c0f0 100644 --- a/src/algorithms/sorting/quick-sort/QuickSort.js +++ b/src/algorithms/sorting/quick-sort/QuickSort.js @@ -18,14 +18,12 @@ export default class QuickSort extends Sort { const leftArray = []; const rightArray = []; - // Take the first element of array as a pivot. - const pivotElement = array.shift(); - const centerArray = [pivotElement]; + // Take the last element of array as a pivot. + const pivotElement = array.pop(); + const centerArray = []; // Split all array elements between left, center and right arrays. - while (array.length) { - const currentElement = array.shift(); - + array.forEach((currentElement) => { // Call visiting callback. this.callbacks.visitingCallback(currentElement); @@ -36,7 +34,10 @@ export default class QuickSort extends Sort { } else { rightArray.push(currentElement); } - } + }); + + // Put the pivot after all equal elements that appeared before it to keep the sort stable. + centerArray.push(pivotElement); // Sort left and right arrays. const leftArraySorted = this.sort(leftArray); diff --git a/src/algorithms/sorting/quick-sort/__test__/QuickSort.test.js b/src/algorithms/sorting/quick-sort/__test__/QuickSort.test.js index 71c1fe71e0..819114e0a8 100644 --- a/src/algorithms/sorting/quick-sort/__test__/QuickSort.test.js +++ b/src/algorithms/sorting/quick-sort/__test__/QuickSort.test.js @@ -9,7 +9,7 @@ import { // Complexity constants. const SORTED_ARRAY_VISITING_COUNT = 190; -const NOT_SORTED_ARRAY_VISITING_COUNT = 62; +const NOT_SORTED_ARRAY_VISITING_COUNT = 85; const REVERSE_SORTED_ARRAY_VISITING_COUNT = 190; const EQUAL_ARRAY_VISITING_COUNT = 19;