-
Notifications
You must be signed in to change notification settings - Fork 77
/
Copy pathCountingSort.js
37 lines (33 loc) · 986 Bytes
/
CountingSort.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* Assumes each of the n input elements is an integer in the range 0 --> k,
* for some integer k. If k = O(n), then CountingSort runs in ϴ(n) time
*
* Notes:
* - Requires no user input of min or max
* - Supports negative numbers
*
* @complexity: O(k) where k is the range
* @flow
*/
export default function CountingSort(elements: number[]): number[] {
let z = 0;
let max = elements[0];
let min = elements[0];
for (let i = 1; i < elements.length; i++) {
max = Math.max(max, elements[i]);
min = Math.min(min, elements[i]);
}
const range = max - min;
const finalArr = new Array(elements.length).fill(0);
// Below is where algorithm may be inefficient (when range is too large)
const countArr = new Array(range + 1 || 0).fill(0);
for (let i = 0; i < elements.length; i++) {
countArr[elements[i] - min]++;
}
for (let i = 0; i <= range; i++) {
while (countArr[i]-- > 0) {
finalArr[z++] = i + min;
}
}
return finalArr;
}