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
3
3
4
4
5
5
struct BitonicSortAlg <: Algorithm end
@@ -23,20 +23,36 @@ defalg(a::StaticVector) =
23
23
return _sort (a, alg, ordr)
24
24
end
25
25
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 similar_type (a, eltype (p))(p)
34
+
35
+ ordr = Perm (ord (lt, by, rev, order), a)
36
+ return similar_type (a, eltype (p))(_sort (p, alg, ordr))
37
+ end
38
+
39
+
26
40
@inline _sort (a:: StaticVector , alg, order) =
27
41
similar_type (a)(sort! (Base. copymutable (a); alg= alg, order= order))
28
42
29
43
@inline _sort (a:: StaticVector , alg:: BitonicSortAlg , order) =
30
44
similar_type (a)(_sort (Tuple (a), alg, order))
31
45
46
+ _sort (a:: NTuple , alg, order) = sort! (Base. copymutable (a); alg= alg, order= order)
47
+
32
48
# Implementation loosely following
33
49
# https://www.inf.hs-flensburg.de/lang/algorithmen/sortieren/bitonic/oddn.htm
34
50
@generated function _sort (a:: NTuple{N} , :: BitonicSortAlg , order) where N
35
51
function swap_expr (i, j, rev)
36
52
ai = Symbol (' a' , i)
37
53
aj = Symbol (' a' , j)
38
54
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) )
40
56
end
41
57
42
58
function merge_exprs (idx, rev)
0 commit comments