OLD | NEW |
| (Empty) |
1 dart_library.library('collection/src/algorithms', null, /* Imports */[ | |
2 'dart/_runtime', | |
3 'collection/src/utils', | |
4 'dart/core', | |
5 'dart/math' | |
6 ], /* Lazy imports */[ | |
7 ], function(exports, dart, utils, core, math) { | |
8 'use strict'; | |
9 let dartx = dart.dartx; | |
10 function binarySearch(sortedList, value, opts) { | |
11 let compare = opts && 'compare' in opts ? opts.compare : null; | |
12 let t = compare; | |
13 t == null ? compare = utils.defaultCompare() : t; | |
14 let min = 0; | |
15 let max = sortedList[dartx.length]; | |
16 while (min < dart.notNull(max)) { | |
17 let mid = min + (dart.notNull(max) - min >> 1); | |
18 let element = sortedList[dartx.get](mid); | |
19 let comp = compare(element, value); | |
20 if (comp == 0) return mid; | |
21 if (dart.notNull(comp) < 0) { | |
22 min = mid + 1; | |
23 } else { | |
24 max = mid; | |
25 } | |
26 } | |
27 return -1; | |
28 } | |
29 dart.fn(binarySearch, () => dart.definiteFunctionType(core.int, [core.List, da
rt.dynamic], {compare: dart.functionType(core.int, [dart.dynamic, dart.dynamic])
})); | |
30 function lowerBound(sortedList, value, opts) { | |
31 let compare = opts && 'compare' in opts ? opts.compare : null; | |
32 let t = compare; | |
33 t == null ? compare = utils.defaultCompare() : t; | |
34 let min = 0; | |
35 let max = sortedList[dartx.length]; | |
36 while (min < dart.notNull(max)) { | |
37 let mid = min + (dart.notNull(max) - min >> 1); | |
38 let element = sortedList[dartx.get](mid); | |
39 let comp = compare(element, value); | |
40 if (dart.notNull(comp) < 0) { | |
41 min = mid + 1; | |
42 } else { | |
43 max = mid; | |
44 } | |
45 } | |
46 return min; | |
47 } | |
48 dart.fn(lowerBound, () => dart.definiteFunctionType(core.int, [core.List, dart
.dynamic], {compare: dart.functionType(core.int, [dart.dynamic, dart.dynamic])})
); | |
49 function shuffle(list, start, end) { | |
50 if (start === void 0) start = 0; | |
51 if (end === void 0) end = null; | |
52 let random = math.Random.new(); | |
53 if (end == null) end = list[dartx.length]; | |
54 let length = dart.notNull(end) - dart.notNull(start); | |
55 while (length > 1) { | |
56 let pos = random.nextInt(length); | |
57 length--; | |
58 let tmp1 = list[dartx.get](dart.notNull(start) + dart.notNull(pos)); | |
59 list[dartx.set](dart.notNull(start) + dart.notNull(pos), list[dartx.get](d
art.notNull(start) + length)); | |
60 list[dartx.set](dart.notNull(start) + length, tmp1); | |
61 } | |
62 } | |
63 dart.fn(shuffle, dart.void, [core.List], [core.int, core.int]); | |
64 function reverse(list, start, end) { | |
65 if (start === void 0) start = 0; | |
66 if (end === void 0) end = null; | |
67 if (end == null) end = list[dartx.length]; | |
68 _reverse(list, start, end); | |
69 } | |
70 dart.fn(reverse, dart.void, [core.List], [core.int, core.int]); | |
71 function _reverse(list, start, end) { | |
72 for (let i = start, j = dart.notNull(end) - 1; dart.notNull(i) < j; i = dart
.notNull(i) + 1, j--) { | |
73 let tmp = list[dartx.get](i); | |
74 list[dartx.set](i, list[dartx.get](j)); | |
75 list[dartx.set](j, tmp); | |
76 } | |
77 } | |
78 dart.fn(_reverse, dart.void, [core.List, core.int, core.int]); | |
79 function insertionSort(list, opts) { | |
80 let compare = opts && 'compare' in opts ? opts.compare : null; | |
81 let start = opts && 'start' in opts ? opts.start : 0; | |
82 let end = opts && 'end' in opts ? opts.end : null; | |
83 let t = compare; | |
84 t == null ? compare = utils.defaultCompare() : t; | |
85 let t$ = end; | |
86 t$ == null ? end = list[dartx.length] : t$; | |
87 for (let pos = dart.notNull(start) + 1; pos < dart.notNull(end); pos++) { | |
88 let min = start; | |
89 let max = pos; | |
90 let element = list[dartx.get](pos); | |
91 while (dart.notNull(min) < max) { | |
92 let mid = dart.notNull(min) + (max - dart.notNull(min) >> 1); | |
93 let comparison = compare(element, list[dartx.get](mid)); | |
94 if (dart.notNull(comparison) < 0) { | |
95 max = mid; | |
96 } else { | |
97 min = mid + 1; | |
98 } | |
99 } | |
100 list[dartx.setRange](dart.notNull(min) + 1, pos + 1, list, min); | |
101 list[dartx.set](min, element); | |
102 } | |
103 } | |
104 dart.fn(insertionSort, () => dart.definiteFunctionType(dart.void, [core.List],
{compare: dart.functionType(core.int, [dart.dynamic, dart.dynamic]), start: cor
e.int, end: core.int})); | |
105 const _MERGE_SORT_LIMIT = 32; | |
106 function mergeSort(list, opts) { | |
107 let start = opts && 'start' in opts ? opts.start : 0; | |
108 let end = opts && 'end' in opts ? opts.end : null; | |
109 let compare = opts && 'compare' in opts ? opts.compare : null; | |
110 let t = end; | |
111 t == null ? end = list[dartx.length] : t; | |
112 let t$ = compare; | |
113 t$ == null ? compare = utils.defaultCompare() : t$; | |
114 let length = dart.notNull(end) - dart.notNull(start); | |
115 if (length < 2) return; | |
116 if (length < dart.notNull(_MERGE_SORT_LIMIT)) { | |
117 insertionSort(list, {compare: compare, start: start, end: end}); | |
118 return; | |
119 } | |
120 let middle = dart.notNull(start) + (dart.notNull(end) - dart.notNull(start)
>> 1); | |
121 let firstLength = middle - dart.notNull(start); | |
122 let secondLength = dart.notNull(end) - middle; | |
123 let scratchSpace = core.List.new(secondLength); | |
124 _mergeSort(list, compare, middle, end, scratchSpace, 0); | |
125 let firstTarget = dart.notNull(end) - firstLength; | |
126 _mergeSort(list, compare, start, middle, list, firstTarget); | |
127 _merge(compare, list, firstTarget, end, scratchSpace, 0, secondLength, list,
start); | |
128 } | |
129 dart.fn(mergeSort, () => dart.definiteFunctionType(dart.void, [core.List], {st
art: core.int, end: core.int, compare: dart.functionType(core.int, [dart.dynamic
, dart.dynamic])})); | |
130 function _movingInsertionSort(list, compare, start, end, target, targetOffset)
{ | |
131 let length = dart.notNull(end) - dart.notNull(start); | |
132 if (length == 0) return; | |
133 target[dartx.set](targetOffset, list[dartx.get](start)); | |
134 for (let i = 1; i < length; i++) { | |
135 let element = list[dartx.get](dart.notNull(start) + i); | |
136 let min = targetOffset; | |
137 let max = dart.notNull(targetOffset) + i; | |
138 while (dart.notNull(min) < max) { | |
139 let mid = dart.notNull(min) + (max - dart.notNull(min) >> 1); | |
140 if (dart.notNull(compare(element, target[dartx.get](mid))) < 0) { | |
141 max = mid; | |
142 } else { | |
143 min = mid + 1; | |
144 } | |
145 } | |
146 target[dartx.setRange](dart.notNull(min) + 1, dart.notNull(targetOffset) +
i + 1, target, min); | |
147 target[dartx.set](min, element); | |
148 } | |
149 } | |
150 dart.fn(_movingInsertionSort, () => dart.definiteFunctionType(dart.void, [core
.List, dart.functionType(core.int, [dart.dynamic, dart.dynamic]), core.int, core
.int, core.List, core.int])); | |
151 function _mergeSort(list, compare, start, end, target, targetOffset) { | |
152 let length = dart.notNull(end) - dart.notNull(start); | |
153 if (length < dart.notNull(_MERGE_SORT_LIMIT)) { | |
154 _movingInsertionSort(list, compare, start, end, target, targetOffset); | |
155 return; | |
156 } | |
157 let middle = dart.notNull(start) + (length >> 1); | |
158 let firstLength = middle - dart.notNull(start); | |
159 let secondLength = dart.notNull(end) - middle; | |
160 let targetMiddle = dart.notNull(targetOffset) + firstLength; | |
161 _mergeSort(list, compare, middle, end, target, targetMiddle); | |
162 _mergeSort(list, compare, start, middle, list, middle); | |
163 _merge(compare, list, middle, middle + firstLength, target, targetMiddle, ta
rgetMiddle + secondLength, target, targetOffset); | |
164 } | |
165 dart.fn(_mergeSort, () => dart.definiteFunctionType(dart.void, [core.List, dar
t.functionType(core.int, [dart.dynamic, dart.dynamic]), core.int, core.int, core
.List, core.int])); | |
166 function _merge(compare, firstList, firstStart, firstEnd, secondList, secondSt
art, secondEnd, target, targetOffset) { | |
167 dart.assert(dart.notNull(firstStart) < dart.notNull(firstEnd)); | |
168 dart.assert(dart.notNull(secondStart) < dart.notNull(secondEnd)); | |
169 let cursor1 = firstStart; | |
170 let cursor2 = secondStart; | |
171 let firstElement = firstList[dartx.get]((() => { | |
172 let x = cursor1; | |
173 cursor1 = dart.notNull(x) + 1; | |
174 return x; | |
175 })()); | |
176 let secondElement = secondList[dartx.get]((() => { | |
177 let x = cursor2; | |
178 cursor2 = dart.notNull(x) + 1; | |
179 return x; | |
180 })()); | |
181 while (true) { | |
182 if (dart.notNull(compare(firstElement, secondElement)) <= 0) { | |
183 target[dartx.set]((() => { | |
184 let x = targetOffset; | |
185 targetOffset = dart.notNull(x) + 1; | |
186 return x; | |
187 })(), firstElement); | |
188 if (cursor1 == firstEnd) break; | |
189 firstElement = firstList[dartx.get]((() => { | |
190 let x = cursor1; | |
191 cursor1 = dart.notNull(x) + 1; | |
192 return x; | |
193 })()); | |
194 } else { | |
195 target[dartx.set]((() => { | |
196 let x = targetOffset; | |
197 targetOffset = dart.notNull(x) + 1; | |
198 return x; | |
199 })(), secondElement); | |
200 if (cursor2 != secondEnd) { | |
201 secondElement = secondList[dartx.get]((() => { | |
202 let x = cursor2; | |
203 cursor2 = dart.notNull(x) + 1; | |
204 return x; | |
205 })()); | |
206 continue; | |
207 } | |
208 target[dartx.set]((() => { | |
209 let x = targetOffset; | |
210 targetOffset = dart.notNull(x) + 1; | |
211 return x; | |
212 })(), firstElement); | |
213 target[dartx.setRange](targetOffset, dart.notNull(targetOffset) + (dart.
notNull(firstEnd) - dart.notNull(cursor1)), firstList, cursor1); | |
214 return; | |
215 } | |
216 } | |
217 target[dartx.set]((() => { | |
218 let x = targetOffset; | |
219 targetOffset = dart.notNull(x) + 1; | |
220 return x; | |
221 })(), secondElement); | |
222 target[dartx.setRange](targetOffset, dart.notNull(targetOffset) + (dart.notN
ull(secondEnd) - dart.notNull(cursor2)), secondList, cursor2); | |
223 } | |
224 dart.fn(_merge, () => dart.definiteFunctionType(dart.void, [dart.functionType(
core.int, [dart.dynamic, dart.dynamic]), core.List, core.int, core.int, core.Lis
t, core.int, core.int, core.List, core.int])); | |
225 // Exports: | |
226 exports.binarySearch = binarySearch; | |
227 exports.lowerBound = lowerBound; | |
228 exports.shuffle = shuffle; | |
229 exports.reverse = reverse; | |
230 exports.insertionSort = insertionSort; | |
231 exports.mergeSort = mergeSort; | |
232 }); | |
OLD | NEW |