1- import Base. Order: Ordering, Forward , ReverseOrdering, ord
2- import Base. Sort: Algorithm, lt, sort
1+ import Base. Order: Forward, Ordering, Perm , ReverseOrdering, ord
2+ import Base. Sort: Algorithm, lt, sort, sortperm
33
44
55struct BitonicSortAlg <: Algorithm end
@@ -23,20 +23,36 @@ defalg(a::StaticVector) =
2323 return _sort (a, alg, ordr)
2424end
2525
26+ @inline function sortperm (a:: StaticVector ;
27+ alg:: Algorithm = defalg (a),
28+ lt = isless,
29+ by = identity,
30+ rev:: Union{Bool,Nothing} = nothing ,
31+ order:: Ordering = Forward)
32+ p = Tuple (axes (a, 1 ))
33+ length (a) <= 1 && return SVector {length(a),Int} (p)
34+
35+ ordr = Perm (ord (lt, by, rev, order), a)
36+ return SVector {length(a),Int} (_sort (p, alg, ordr))
37+ end
38+
39+
2640@inline _sort (a:: StaticVector , alg, order) =
2741 similar_type (a)(sort! (Base. copymutable (a); alg= alg, order= order))
2842
2943@inline _sort (a:: StaticVector , alg:: BitonicSortAlg , order) =
3044 similar_type (a)(_sort (Tuple (a), alg, order))
3145
46+ _sort (a:: NTuple , alg, order) = sort! (Base. copymutable (a); alg= alg, order= order)
47+
3248# Implementation loosely following
3349# https://www.inf.hs-flensburg.de/lang/algorithmen/sortieren/bitonic/oddn.htm
3450@generated function _sort (a:: NTuple{N} , :: BitonicSortAlg , order) where N
3551 function swap_expr (i, j, rev)
3652 ai = Symbol (' a' , i)
3753 aj = Symbol (' a' , j)
3854 order = rev ? :revorder : :order
39- return :( ($ ai, $ aj) = lt ($ order, $ ai, $ aj) ? ($ ai, $ aj) : ($ aj, $ ai) )
55+ return :( ($ ai, $ aj) = @inbounds lt ($ order, $ ai, $ aj) ? ($ ai, $ aj) : ($ aj, $ ai) )
4056 end
4157
4258 function merge_exprs (idx, rev)
0 commit comments