@@ -231,56 +231,42 @@ end
231231
232232Sorts the tuple `t`.
233233"""
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)
235235@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)... )
243252 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)... )
249254 end
250- return (t[i], _sort (_deleteat (t, i), lt, by, rev)... )
251255end
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+
254259
255260"""
256261 sortperm(t::Tuple; lt=isless, by=identity, rev::Bool=false) -> ::Tuple
257262
258263
259264Computes a tuple that contains the permutation required to sort `t`.
260265"""
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)
262267@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)
279269end
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)
284270
285271"""
286272 getindices(t::Tuple, I::Tuple{Vararg{Int}}) -> ::Tuple
0 commit comments