@@ -5,8 +5,9 @@ export default class CountingSort extends Sort {
5
5
* @param {number[] } originalArray
6
6
* @param {number } [biggestElement]
7
7
*/
8
- sort ( originalArray , biggestElement = 0 ) {
8
+ sort ( originalArray , smallestElement = 0 , biggestElement = 0 ) {
9
9
// Detect biggest element in array in order to build number bucket array later.
10
+ let detectedSmallestElement = smallestElement ;
10
11
let detectedBiggestElement = biggestElement ;
11
12
if ( ! detectedBiggestElement ) {
12
13
originalArray . forEach ( ( element ) => {
@@ -16,17 +17,20 @@ export default class CountingSort extends Sort {
16
17
if ( this . comparator . greaterThan ( element , detectedBiggestElement ) ) {
17
18
detectedBiggestElement = element ;
18
19
}
20
+ if ( this . comparator . greaterThan ( detectedSmallestElement , element ) ) {
21
+ detectedSmallestElement = element ;
22
+ }
19
23
} ) ;
20
24
}
21
25
22
26
// Init buckets array.
23
27
// This array will hold frequency of each number from originalArray.
24
- const buckets = Array ( detectedBiggestElement + 1 ) . fill ( 0 ) ;
28
+ const buckets = Array ( detectedBiggestElement - detectedSmallestElement + 1 ) . fill ( 0 ) ;
25
29
originalArray . forEach ( ( element ) => {
26
30
// Visit element.
27
31
this . callbacks . visitingCallback ( element ) ;
28
32
29
- buckets [ element ] += 1 ;
33
+ buckets [ element - detectedSmallestElement ] += 1 ;
30
34
} ) ;
31
35
32
36
// Add previous frequencies to the current one for each number in bucket
@@ -53,13 +57,13 @@ export default class CountingSort extends Sort {
53
57
this . callbacks . visitingCallback ( element ) ;
54
58
55
59
// Get correct position of this element in sorted array.
56
- const elementSortedPosition = buckets [ element ] ;
60
+ const elementSortedPosition = buckets [ element - detectedSmallestElement ] ;
57
61
58
62
// Put element into correct position in sorted array.
59
63
sortedArray [ elementSortedPosition ] = element ;
60
64
61
65
// Increase position of current element in the bucket for future correct placements.
62
- buckets [ element ] += 1 ;
66
+ buckets [ element - detectedSmallestElement ] += 1 ;
63
67
}
64
68
65
69
// Return sorted array.
0 commit comments