Skip to content

feat: adding helper function , interface to encapsulate the module and changes to the test #1685

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 45 additions & 8 deletions Sorts/QuickSortRecursive.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,39 @@
Problem & Source of Explanation => https://www.cs.auckland.ac.nz/software/AlgAnim/qsort1a.html
*/


/**
* Partition in place QuickSort.
* @param {number[]} inputList list of values.
* @param {number} low lower index for partition.
* @param {number} high higher index for partition.
* Sorts the input list using the quicksort algorithm.
*
* @param {Array} inputList - the list to be sorted
* @return {Array} the sorted list
*/
const quickSort = (inputList, low, high) => {
// encapsulate the main function to to be the interface of our module
const quickSort = (inputList) => {
if (!Array.isArray(inputList)) {
throw new TypeError('Please input a valid list or array.')
}
return quickSortHelper(inputList, 0, inputList.length - 1)
}


/**
* Recursively sorts the input list using the quicksort algorithm.
*
* @param {number[]} inputList - the list to be sorted
* @param {number} low - the lower index of the current partition
* @param {number} high - the higher index of the current partition
* @return {number[]} the sorted list
*/

const quickSortHelper = (inputList, low, high) => {
// base case
if (low < high) {
// get the partition index.
const pIndex = partition(inputList, low, high)
// recursively call the quickSort method again.
quickSort(inputList, low, pIndex - 1)
quickSort(inputList, pIndex + 1, high)
quickSortHelper(inputList, low, pIndex - 1)
quickSortHelper(inputList, pIndex + 1, high)
}
return inputList
}
Expand All @@ -43,7 +60,9 @@ const quickSort = (inputList, low, high) => {
* @returns {number} `pIndex` pivot index value.
*/
const partition = (partitionList, low, high) => {
const pivot = partitionList[high]
let mid =Math.floor((low + high) / 2)
// get the median of three is good technique for partitioning to be sure that the 2 sub-arrays will be almost equal or near
const pivot = medianOfThree(partitionList, low, mid, high)
let pIndex = low
for (let index = low; index <= high - 1; index++) {
if (partitionList[index] < pivot) {
Expand All @@ -62,4 +81,22 @@ const partition = (partitionList, low, high) => {
return pIndex
}


/**
* Returns the median value of three elements in an array.
*
* @param {number[]} arr - the input array
* @param {number} low - the index of the first element
* @param {number} mid - the index of the second element
* @param {number} high - the index of the third element
* @return {number} the median value of the three elements
*/

const medianOfThree = (partitionList, low,mid, high) => {
const a = partitionList[low], b = partitionList[mid], c = partitionList[high];
if ((a > b) !== (a > c)) return a;
else if ((b > a) !== (b > c)) return b;
else return c;
}

export { quickSort }
10 changes: 5 additions & 5 deletions Sorts/test/QuickSortRecursive.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,29 @@ import { quickSort } from '../QuickSortRecursive'

describe('QuickSortRecursive | Partition In Place Method', () => {
it('Expectedly, throw some error if we pass a non-array input', () => {
expect(() => quickSort('xyz', 0, 2)).toThrow(
expect(() => quickSort('xyz')).toThrow(
'Please input a valid list or array.'
)
expect(() => quickSort(null, 0, 4)).toThrow(
expect(() => quickSort(null)).toThrow(
'Please input a valid list or array.'
)
expect(() => quickSort(55, 0, 2)).toThrow(
expect(() => quickSort(55)).toThrow(
'Please input a valid list or array.'
)
})

it('Expectedly, the quickSort method will sort the unsorted list in ascending order', () => {
const unSortArray = [5, 9, 3, 4, 6, 2, 0, 1, 7, 8]
const sortedExpectedArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
expect(quickSort(unSortArray, 0, unSortArray.length - 1)).toEqual(
expect(quickSort(unSortArray)).toEqual(
sortedExpectedArray
)
})

it('Expectedly, the quickSort method will arrange the list of character values in dictionary order.', () => {
const unSortList = ['d', 'e', 'c', 'a', 'f', 'b']
const sortedExpectedList = ['a', 'b', 'c', 'd', 'e', 'f']
expect(quickSort(unSortList, 0, unSortList.length - 1)).toEqual(
expect(quickSort(unSortList)).toEqual(
sortedExpectedList
)
})
Expand Down
Loading