@@ -231,56 +231,42 @@ end
231
231
232
232
Sorts the tuple `t`.
233
233
"""
234
- @inline sort (t:: Tuple ; lt= isless, by= identity, rev:: Bool = false ) = _sort (t, lt, by, rev)
234
+ sort (t:: Tuple ; lt= isless, by= identity, rev:: Bool = false ) = _sort (t, lt, by, rev)
235
235
@inline function _sort (t:: Tuple , lt= isless, by= identity, rev:: Bool = false )
236
- i = 1
237
- if rev
238
- for k = 2 : length (t)
239
- if lt (by (t[i]), by (t[k]))
240
- i = k
241
- end
242
- end
236
+ t1, t2 = _split (t)
237
+ t1s = _sort (t1, lt, by, rev)
238
+ t2s = _sort (t2, lt, by, rev)
239
+ return _merge (t1s, t2s, lt, by, rev)
240
+ end
241
+ _sort (t:: Tuple{Any} , lt= isless, by= identity, rev:: Bool = false ) = t
242
+ _sort (t:: Tuple{} , lt= isless, by= identity, rev:: Bool = false ) = t
243
+
244
+ function _split (t:: NTuple{N} ) where N
245
+ M = N>> 1
246
+ ntuple (i-> t[i], M), ntuple (i-> t[i+ M], N- M)
247
+ end
248
+
249
+ @inline function _merge (t1:: Tuple , t2:: Tuple , lt, by, rev)
250
+ if lt (by (first (t1)), by (first (t2))) != rev
251
+ return (first (t1), _merge (tail (t1), t2, lt, by, rev)... )
243
252
else
244
- for k = 2 : length (t)
245
- if lt (by (t[k]), by (t[i]))
246
- i = k
247
- end
248
- end
253
+ return (first (t2), _merge (t1, tail (t2), lt, by, rev)... )
249
254
end
250
- return (t[i], _sort (_deleteat (t, i), lt, by, rev)... )
251
255
end
252
- @inline _sort (t:: Tuple{Any} , lt= isless, by= identity, rev:: Bool = false ) = t
253
- @inline _sort (t:: Tuple{} , lt= isless, by= identity, rev:: Bool = false ) = t
256
+ _merge (t1:: Tuple{} , t2:: Tuple , lt, by, rev) = t2
257
+ _merge (t1:: Tuple , t2:: Tuple{} , lt, by, rev) = t1
258
+
254
259
255
260
"""
256
261
sortperm(t::Tuple; lt=isless, by=identity, rev::Bool=false) -> ::Tuple
257
262
258
263
259
264
Computes a tuple that contains the permutation required to sort `t`.
260
265
"""
261
- @inline sortperm (t:: Tuple ; lt= isless, by= identity, rev:: Bool = false ) = _sortperm (t, lt, by, rev)
266
+ sortperm (t:: Tuple ; lt= isless, by= identity, rev:: Bool = false ) = _sortperm (t, lt, by, rev)
262
267
@inline function _sortperm (t:: Tuple , lt= isless, by= identity, rev:: Bool = false )
263
- i:: Int = 1
264
- if rev
265
- for k = 2 : length (t)
266
- if lt (by (t[i]), by (t[k]))
267
- i = k
268
- end
269
- end
270
- else
271
- for k = 2 : length (t)
272
- if lt (by (t[k]), by (t[i]))
273
- i = k
274
- end
275
- end
276
- end
277
- r = _sortperm (_deleteat (t, i), lt, by, rev)
278
- return (i, _ishift (r, i, + 1 )... )
268
+ _sort (ntuple (identity, length (t)), lt, i-> by (getindex (t, i)), rev)
279
269
end
280
- @inline _sortperm (t:: Tuple{Any} , lt= isless, by= identity, rev:: Bool = false ) = (1 ,)
281
- @inline _sortperm (t:: Tuple{} , lt= isless, by= identity, rev:: Bool = false ) = ()
282
-
283
- _ishift (t:: Tuple{Vararg{Int}} , i:: Int , s:: Int ) = map (n-> (n < i ? n : n+ s), t)
284
270
285
271
"""
286
272
getindices(t::Tuple, I::Tuple{Vararg{Int}}) -> ::Tuple
0 commit comments