1
1
import type { Index , Size , CompareFunction } from './types' ;
2
- import { binarySearch } from './binarySearch' ;
3
2
import { bubbleSort } from './bubbleSort' ;
3
+ import { binarySearch } from "./binarySearch" ;
4
4
5
5
/**
6
6
*
7
7
*/
8
- export class SortedArray < T > {
9
- private array : T [ ] = [ ] ;
8
+ export class SortedArray < T = number > {
9
+ private readonly array : T [ ] = [ ] ;
10
+ private readonly compare : CompareFunction < T > ;
10
11
11
12
/**
12
13
*
13
14
* @param array -
14
15
* @param compareFunction -
15
16
*/
16
- constructor ( array : T [ ] , compareFunction ?: CompareFunction < T > ) {
17
- if ( compareFunction ) {
18
- this . compare = compareFunction ;
19
- }
20
-
17
+ constructor ( array : T [ ] , compareFunction : CompareFunction < T > ) {
18
+ this . compare = compareFunction ;
21
19
this . array = bubbleSort ( array , this . compare ) ;
22
20
}
23
21
@@ -27,45 +25,194 @@ export class SortedArray<T> {
27
25
* @param unique -
28
26
*/
29
27
insert ( element : T , unique = true ) : Index {
30
- let pos = binarySearch ( this . array , element , this . compare , true ) ;
28
+ let high = this . array . length - 1 ;
29
+ let low = 0 ;
30
+ let pos = - 1 ;
31
+ let index = 0 ;
32
+ let ordering = 0 ;
33
+
34
+ while ( high >= low ) {
35
+ index = ( high + low ) / 2 >>> 0 ;
36
+ ordering = this . compare ( this . array [ index ] , element ) ;
37
+ if ( ordering < 0 ) {
38
+ low = index + 1 ;
39
+ } else if ( ordering > 0 ) {
40
+ high = index - 1 ;
41
+ } else {
42
+ pos = index ;
43
+ break ;
44
+ }
45
+ }
46
+
47
+ if ( pos === - 1 ) {
48
+ pos = high ;
49
+ }
31
50
32
51
pos ++ ;
33
52
34
- let high = this . array . length - 1 ;
53
+ high = this . array . length - 1 ;
35
54
while ( ( pos < high ) && ( this . compare ( element , this . array [ pos ] ) === 0 ) ) {
36
55
pos ++ ;
37
56
}
38
57
39
- let mid = this . array . length ;
58
+ index = this . array . length ;
40
59
this . array . push ( element ) ;
41
- while ( mid > pos ) {
42
- this . array [ mid ] = this . array [ -- mid ] ;
60
+ while ( index > pos ) {
61
+ this . array [ index ] = this . array [ -- index ] ;
43
62
}
44
63
45
64
this . array [ pos ] = element ;
46
65
47
66
return pos ;
48
67
}
49
- delete ( element : T , all = true ) : Index { }
50
68
51
- set ( index : Index , element : T ) : T { }
52
- get ( index : Index ) : T { }
69
+ /**
70
+ *
71
+ * @param element -
72
+ * @param all -
73
+ */
74
+ delete ( element : T , all = true ) : Index {
75
+ const index = binarySearch ( this . array , element , this . compare ) ;
53
76
54
- search ( element : T ) : Index { }
55
- has ( element : T ) : boolean { }
77
+ if ( index === - 1 ) {
78
+ return index ;
79
+ }
56
80
57
- slice ( from : Index , to = this . array . length ) : SortedArray < T > { }
58
- splice ( from : Index , to = this . array . length ) : SortedArray < T > { }
59
- concat ( array : T [ ] | SortedArray < T > ) : SortedArray < T > { }
60
- merge ( array : T [ ] | SortedArray < T > ) : Size { }
81
+ this . array . splice ( index , 1 ) ;
61
82
62
- peek ( index : Index ) : T { }
63
- first ( ) : T { }
64
- last ( ) : T { }
83
+ return index ;
84
+ }
65
85
66
- join ( separator : string ) : string { }
86
+ /**
87
+ *
88
+ * @param index -
89
+ */
90
+ get ( index : Index ) : T {
91
+ return this . array [ index ] ;
92
+ }
67
93
68
- toArray ( ) : T [ ] { }
94
+ /**
95
+ *
96
+ * @param element -
97
+ */
98
+ search ( element : T ) : Index {
99
+ const index = binarySearch ( this . array , element , this . compare ) ;
69
100
70
- private compare ( a : T , b : T ) : number { }
101
+ return index ;
102
+ }
103
+
104
+ /**
105
+ *
106
+ * @param element -
107
+ */
108
+ has ( element : T ) : boolean {
109
+ const index = binarySearch ( this . array , element , this . compare ) ;
110
+
111
+ return ( index !== - 1 ) ;
112
+ }
113
+
114
+ /**
115
+ *
116
+ * @param from -
117
+ * @param to -
118
+ */
119
+ slice ( from : Index , to = this . array . length ) : SortedArray < T > {
120
+ const slice = this . array . slice ( from , to ) ;
121
+ const sortedArray = new SortedArray < T > ( slice , this . compare ) ;
122
+
123
+ return sortedArray ;
124
+ }
125
+
126
+ /**
127
+ *
128
+ * @param from -
129
+ * @param to -
130
+ */
131
+ splice ( from : Index , to = this . array . length ) : SortedArray < T > {
132
+ const splice = this . array . splice ( from , to ) ;
133
+ const sortedArray = new SortedArray < T > ( splice , this . compare ) ;
134
+
135
+ return sortedArray ;
136
+ }
137
+
138
+ /**
139
+ *
140
+ * @param array -
141
+ */
142
+ concat ( array : T [ ] | SortedArray < T > ) : SortedArray < T > {
143
+ const one = array instanceof SortedArray ? array . toArray ( ) : array ;
144
+ const two = this . array . slice ( 0 ) ;
145
+ const tree = one . concat ( two ) ;
146
+ const sortedArray = new SortedArray < T > ( tree , this . compare ) ;
147
+
148
+ return sortedArray ;
149
+ }
150
+
151
+ /**
152
+ *
153
+ * @param array -
154
+ */
155
+ merge ( array : T [ ] | SortedArray < T > ) : Size {
156
+ for ( const element of array ) {
157
+ this . insert ( element ) ;
158
+ }
159
+
160
+ return this . array . length ;
161
+ }
162
+
163
+ /**
164
+ *
165
+ */
166
+ first ( ) : T | undefined {
167
+ return this . array . at ( 0 ) ;
168
+ }
169
+
170
+ /**
171
+ *
172
+ */
173
+ last ( ) : T | undefined {
174
+ return this . array . at ( - 1 ) ;
175
+ }
176
+
177
+ /**
178
+ *
179
+ * @param separator
180
+ */
181
+ join ( separator : string ) : string {
182
+ return this . array . join ( separator ) ;
183
+ }
184
+
185
+ /**
186
+ *
187
+ */
188
+ toArray ( ) : T [ ] {
189
+ return this . array . slice ( 0 ) ;
190
+ }
191
+
192
+ get length ( ) {
193
+ return this . array . length ;
194
+ }
195
+
196
+ [ Symbol . iterator ] ( ) {
197
+ let i = 0 ;
198
+ const array = this . array ;
199
+
200
+ return {
201
+ next ( ) {
202
+ if ( i < array . length - 1 ) {
203
+ i = i + 1 ;
204
+
205
+ return {
206
+ value : array [ i ] ,
207
+ done : false
208
+ }
209
+ }
210
+
211
+ return {
212
+ value : array [ i ] ,
213
+ done : true
214
+ }
215
+ }
216
+ }
217
+ }
71
218
}
0 commit comments