Skip to content

Commit 17a325d

Browse files
committed
feat(core): add quick select
1 parent ea85845 commit 17a325d

File tree

4 files changed

+46
-0
lines changed

4 files changed

+46
-0
lines changed

packages/core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export * from './bubbleSort';
1313
export * from './insertionSort';
1414
export * from './linearSearch';
1515
export * from './mergeSort';
16+
export * from './quickSelect';
1617
export * from './quickSort';
1718
export * from './radixSort';
1819
export * from './selectionSort';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { kthLargest, kthSmallest } from './quickSelect';
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { kthLargest, kthSmallest } from './quickSelect';
2+
3+
describe('quickSelect', () => {
4+
it('returns the kth largest element', () => {
5+
const arr = [3, 2, 1, 5, 6, 4];
6+
expect(kthLargest(arr, 2)).toBe(5);
7+
});
8+
9+
it('returns the kth smallest element with duplicate inputs', () => {
10+
const arr = [-1, -1, 0, 5, 12];
11+
expect(kthSmallest(arr, 3)).toEqual(0);
12+
});
13+
});
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
function quickSelect(arr: number[], k: number, left = 0, right = arr.length - 1): number {
2+
const pivot = arr[right];
3+
let p = left;
4+
5+
for (let i = left; i < right; i++) {
6+
if (arr[i] <= pivot) {
7+
[arr[i], arr[p]] = [arr[p], arr[i]];
8+
p++;
9+
}
10+
}
11+
12+
[arr[p], arr[right]] = [arr[right], arr[p]];
13+
14+
if (p === k) {
15+
return arr[p];
16+
}
17+
18+
if (p > k) {
19+
return quickSelect(arr, k, left, p - 1);
20+
} else {
21+
return quickSelect(arr, k, p + 1, right);
22+
}
23+
}
24+
25+
export function kthLargest(arr: number[], k: number): number {
26+
return quickSelect(arr, arr.length - k);
27+
}
28+
29+
export function kthSmallest(arr: number[], k: number): number {
30+
return quickSelect(arr, k - 1);
31+
}

0 commit comments

Comments
 (0)