Skip to content

Commit 8cb25b8

Browse files
committed
Merge branch 'sortupdate'
2 parents fa95c6c + bfab4b0 commit 8cb25b8

File tree

2 files changed

+25
-38
lines changed

2 files changed

+25
-38
lines changed

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ os:
44
- linux
55
- osx
66
julia:
7-
- 0.7
7+
- 1.0
8+
- 1.1
89
- nightly
910
notifications:
1011
email: false

src/TupleTools.jl

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -231,56 +231,42 @@ end
231231
232232
Sorts 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)...)
251255
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+
254259

255260
"""
256261
sortperm(t::Tuple; lt=isless, by=identity, rev::Bool=false) -> ::Tuple
257262
258263
259264
Computes 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)
279269
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)
284270

285271
"""
286272
getindices(t::Tuple, I::Tuple{Vararg{Int}}) -> ::Tuple

0 commit comments

Comments
 (0)