From e424ba2a4fafff27feb1ebbc1b95d93d4fdeaa9a Mon Sep 17 00:00:00 2001 From: Andrew Chudinovskyh Date: Sat, 31 Oct 2020 17:33:26 +0200 Subject: [PATCH 1/2] Added QuickSelect Algorithm --- DIRECTORY.md | 1 + Search/QuickSelectSearch.js | 55 +++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 Search/QuickSelectSearch.js diff --git a/DIRECTORY.md b/DIRECTORY.md index 5b8240d8dd..dea092360e 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -178,6 +178,7 @@ * [InterpolationSearch](https://github.com/TheAlgorithms/Javascript/blob/master/Search/InterpolationSearch.js) * [JumpSearch](https://github.com/TheAlgorithms/Javascript/blob/master/Search/JumpSearch.js) * [LinearSearch](https://github.com/TheAlgorithms/Javascript/blob/master/Search/LinearSearch.js) + * [QuickSelect](https://github.com/TheAlgorithms/Javascript/blob/master/Search/QuickSelectSearch.js) * [StringSearch](https://github.com/TheAlgorithms/Javascript/blob/master/Search/StringSearch.js) ## Sorts diff --git a/Search/QuickSelectSearch.js b/Search/QuickSelectSearch.js new file mode 100644 index 0000000000..724fb8d13e --- /dev/null +++ b/Search/QuickSelectSearch.js @@ -0,0 +1,55 @@ +/* + * Places the `k` smallest elements in `array` in the first `k` indices: `[0..k-1]` + * Modifies the passed in array *in place* + * Returns a slice of the wanted elements for convenience + * Efficient mainly because it never performs a full sort. + * + * The only guarantees are that: + * + * - The `k`th element is in its final sort index (if the array were to be sorted) + * - All elements before index `k` are smaller than the `k`th element + * + * [Reference](http://en.wikipedia.org/wiki/Quickselect) + */ +function quickSelectSearch(array, k) { + if (!array || array.length <= k) { + throw new Error('Invalid arguments'); + } + + let from = 0; + let to = array.length - 1; + while (from < to) { + let left = from; + let right = to; + const pivot = array[Math.ceil((left + right) * 0.5)]; + + while (left < right) { + if (array[left] >= pivot) { + const tmp = array[left]; + array[left] = array[right]; + array[right] = tmp; + --right; + } else { + ++left; + } + } + + if (array[left] > pivot) { + --left; + } + + if (k <= left) { + to = left; + } else { + from = left + 1; + } + } + return array; +} + +/* ---------------------------------- Test ---------------------------------- */ + +const arr = [1121111, 21, 333, 41, 5, 66, 7777, 28, 19, 11110] +console.log(quickSelectSearch(arr, 5)); // [ 19, 21, 28, 41, 5, 66, 333, 11110, 1121111, 7777 ] +console.log(quickSelectSearch(arr, 2)); // [ 19, 5, 21, 41, 28, 333, 11110, 1121111, 7777, 66 ] +console.log(quickSelectSearch(arr, 7)); // [ 19, 5, 21, 41, 28, 66, 333, 7777, 11110, 1121111 ] From 83b05cde159e863b0bb278116b69f9df3e1ac6da Mon Sep 17 00:00:00 2001 From: Andrew Chudinovskyh Date: Sat, 31 Oct 2020 17:53:08 +0200 Subject: [PATCH 2/2] style fixes --- Search/QuickSelectSearch.js | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/Search/QuickSelectSearch.js b/Search/QuickSelectSearch.js index 724fb8d13e..7a8c57bd3d 100644 --- a/Search/QuickSelectSearch.js +++ b/Search/QuickSelectSearch.js @@ -11,45 +11,45 @@ * * [Reference](http://en.wikipedia.org/wiki/Quickselect) */ -function quickSelectSearch(array, k) { +function quickSelectSearch (array, k) { if (!array || array.length <= k) { - throw new Error('Invalid arguments'); + throw new Error('Invalid arguments') } - let from = 0; - let to = array.length - 1; + let from = 0 + let to = array.length - 1 while (from < to) { - let left = from; - let right = to; - const pivot = array[Math.ceil((left + right) * 0.5)]; + let left = from + let right = to + const pivot = array[Math.ceil((left + right) * 0.5)] while (left < right) { if (array[left] >= pivot) { - const tmp = array[left]; - array[left] = array[right]; - array[right] = tmp; - --right; + const tmp = array[left] + array[left] = array[right] + array[right] = tmp + --right } else { - ++left; + ++left } } if (array[left] > pivot) { - --left; + --left } if (k <= left) { - to = left; + to = left } else { - from = left + 1; + from = left + 1 } } - return array; + return array } /* ---------------------------------- Test ---------------------------------- */ const arr = [1121111, 21, 333, 41, 5, 66, 7777, 28, 19, 11110] -console.log(quickSelectSearch(arr, 5)); // [ 19, 21, 28, 41, 5, 66, 333, 11110, 1121111, 7777 ] -console.log(quickSelectSearch(arr, 2)); // [ 19, 5, 21, 41, 28, 333, 11110, 1121111, 7777, 66 ] -console.log(quickSelectSearch(arr, 7)); // [ 19, 5, 21, 41, 28, 66, 333, 7777, 11110, 1121111 ] +console.log(quickSelectSearch(arr, 5)) // [ 19, 21, 28, 41, 5, 66, 333, 11110, 1121111, 7777 ] +console.log(quickSelectSearch(arr, 2)) // [ 19, 5, 21, 41, 28, 333, 11110, 1121111, 7777, 66 ] +console.log(quickSelectSearch(arr, 7)) // [ 19, 5, 21, 41, 28, 66, 333, 7777, 11110, 1121111 ]