From 95b1cc18937dcfa968892887f4127d783563e6db Mon Sep 17 00:00:00 2001 From: Peter Ahrens Date: Fri, 26 Jul 2019 16:32:23 -0400 Subject: [PATCH 1/3] sorting networks for tuples under length 32, default algorithm for larger tuples. --- base/Base.jl | 1 + base/sorttuple.jl | 82 +++++++++++++++++++++++++++++++++++++++++++++++ test/sorting.jl | 54 +++++++++++++++++++++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 base/sorttuple.jl diff --git a/base/Base.jl b/base/Base.jl index 7c5274405668b..72fbd949bb362 100644 --- a/base/Base.jl +++ b/base/Base.jl @@ -353,6 +353,7 @@ include("loading.jl") include("util.jl") include("asyncmap.jl") +include("sorttuple.jl") # experimental API's include("experimental.jl") diff --git a/base/sorttuple.jl b/base/sorttuple.jl new file mode 100644 index 0000000000000..69a0c156187e1 --- /dev/null +++ b/base/sorttuple.jl @@ -0,0 +1,82 @@ +function sort(t::Tuple; dims::Integer = 1, alg::Algorithm=Base.DEFAULT_UNSTABLE, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward) + #@assert dims == 1 + return tuplesort(t, lt, by, rev) +end + +swaps = [ + [], + [], + [(1, 2), ], + [(2, 3), (1, 3), (1, 2), ], + [(1, 2), (3, 4), (1, 3), (2, 4), (2, 3), ], + [(1, 2), (4, 5), (3, 5), (3, 4), (1, 4), (1, 3), (2, 5), (2, 4), (2, 3), ], + [(2, 3), (1, 3), (1, 2), (5, 6), (4, 6), (4, 5), (1, 4), (2, 5), (3, 6), (3, 5), (2, 4), (3, 4), ], + [(2, 3), (1, 3), (1, 2), (4, 5), (6, 7), (4, 6), (5, 7), (5, 6), (1, 5), (1, 4), (2, 6), (3, 7), (3, 6), (2, 4), (3, 5), (3, 4), ], + [(1, 2), (3, 4), (1, 3), (2, 4), (2, 3), (5, 6), (7, 8), (5, 7), (6, 8), (6, 7), (1, 5), (2, 6), (2, 5), (3, 7), (4, 8), (4, 7), (3, 5), (4, 6), (4, 5), ], + [(1, 2), (4, 5), (7, 8), (2, 3), (5, 6), (8, 9), (1, 2), (4, 5), (7, 8), (1, 4), (4, 7), (1, 4), (2, 5), (5, 8), (2, 5), (3, 6), (6, 9), (3, 6), (2, 4), (6, 8), (3, 7), (5, 7), (3, 5), (3, 4), (6, 7), ], + [(5, 10), (4, 9), (3, 8), (2, 7), (1, 6), (2, 5), (7, 10), (1, 4), (6, 9), (1, 3), (4, 7), (8, 10), (1, 2), (3, 5), (6, 8), (9, 10), (2, 3), (5, 7), (8, 9), (4, 6), (3, 6), (7, 9), (2, 4), (5, 8), (3, 4), (7, 8), (4, 5), (6, 7), (5, 6), ], + [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (2, 4), (6, 8), (1, 3), (5, 7), (9, 11), (2, 3), (6, 7), (10, 11), (2, 6), (7, 11), (6, 10), (3, 7), (2, 6), (7, 11), (1, 5), (4, 8), (5, 9), (1, 5), (2, 5), (8, 11), (4, 9), (3, 4), (9, 10), (3, 5), (8, 10), (4, 6), (7, 9), (4, 5), (6, 7), (8, 9), ], + [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (2, 4), (6, 8), (10, 12), (1, 3), (5, 7), (9, 11), (2, 3), (6, 7), (10, 11), (2, 6), (7, 11), (6, 10), (3, 7), (2, 6), (7, 11), (1, 5), (8, 12), (4, 8), (5, 9), (1, 5), (8, 12), (2, 5), (8, 11), (4, 9), (3, 4), (9, 10), (3, 5), (8, 10), (4, 6), (7, 9), (4, 5), (6, 7), (8, 9), ], + [(2, 8), (10, 12), (4, 5), (6, 9), (1, 13), (3, 7), (1, 2), (3, 4), (5, 7), (9, 12), (8, 13), (6, 10), (1, 3), (4, 8), (11, 12), (2, 5), (7, 13), (8, 9), (12, 13), (5, 10), (7, 11), (4, 5), (6, 7), (9, 10), (11, 12), (2, 8), (3, 7), (10, 12), (2, 4), (5, 8), (9, 11), (1, 6), (3, 6), (7, 9), (10, 11), (2, 3), (4, 6), (8, 9), (5, 7), (3, 4), (5, 6), (7, 8), (9, 10), (4, 5), (6, 7), ], + [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (1, 3), (5, 7), (9, 11), (2, 4), (6, 8), (10, 12), (1, 5), (9, 13), (2, 6), (10, 14), (3, 7), (4, 8), (1, 9), (2, 10), (3, 11), (4, 12), (5, 13), (6, 14), (6, 11), (7, 10), (4, 13), (8, 12), (2, 3), (5, 9), (2, 5), (8, 14), (3, 9), (3, 5), (6, 7), (10, 11), (12, 14), (4, 9), (8, 13), (7, 9), (11, 13), (4, 6), (8, 10), (4, 5), (6, 7), (8, 9), (10, 11), (12, 13), (7, 8), (9, 10), ], + [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (1, 3), (5, 7), (9, 11), (13, 15), (2, 4), (6, 8), (10, 12), (1, 5), (9, 13), (2, 6), (10, 14), (3, 7), (11, 15), (4, 8), (1, 9), (2, 10), (3, 11), (4, 12), (5, 13), (6, 14), (7, 15), (6, 11), (7, 10), (4, 13), (14, 15), (8, 12), (2, 3), (5, 9), (2, 5), (8, 14), (3, 9), (12, 15), (3, 5), (6, 7), (10, 11), (12, 14), (4, 9), (8, 13), (7, 9), (11, 13), (4, 6), (8, 10), (4, 5), (6, 7), (8, 9), (10, 11), (12, 13), (7, 8), (9, 10), ], + [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (15, 16), (1, 3), (5, 7), (9, 11), (13, 15), (2, 4), (6, 8), (10, 12), (14, 16), (1, 5), (9, 13), (2, 6), (10, 14), (3, 7), (11, 15), (4, 8), (12, 16), (1, 9), (2, 10), (3, 11), (4, 12), (5, 13), (6, 14), (7, 15), (8, 16), (6, 11), (7, 10), (4, 13), (14, 15), (8, 12), (2, 3), (5, 9), (2, 5), (8, 14), (3, 9), (12, 15), (3, 5), (6, 7), (10, 11), (12, 14), (4, 9), (8, 13), (7, 9), (11, 13), (4, 6), (8, 10), (4, 5), (6, 7), (8, 9), (10, 11), (12, 13), (7, 8), (9, 10), ], + [(1, 2), (3, 4), (1, 3), (2, 4), (2, 3), (5, 6), (7, 8), (5, 7), (6, 8), (6, 7), (1, 5), (2, 6), (2, 5), (3, 7), (4, 8), (4, 7), (3, 5), (4, 6), (4, 5), (9, 10), (11, 12), (9, 11), (10, 12), (10, 11), (13, 14), (16, 17), (15, 17), (15, 16), (13, 16), (13, 15), (14, 17), (14, 16), (14, 15), (9, 14), (9, 13), (10, 15), (10, 14), (10, 13), (11, 16), (12, 17), (12, 16), (11, 14), (11, 13), (12, 15), (12, 14), (12, 13), (1, 10), (1, 9), (2, 11), (2, 10), (2, 9), (3, 12), (4, 13), (4, 12), (3, 10), (3, 9), (4, 11), (4, 10), (4, 9), (5, 14), (6, 15), (6, 14), (7, 16), (8, 17), (8, 16), (7, 14), (8, 15), (8, 14), (5, 10), (5, 9), (6, 11), (6, 10), (6, 9), (7, 12), (8, 13), (8, 12), (7, 10), (7, 9), (8, 11), (8, 10), (8, 9), ], + [(1, 2), (3, 4), (1, 3), (2, 4), (2, 3), (5, 6), (8, 9), (7, 9), (7, 8), (5, 8), (5, 7), (6, 9), (6, 8), (6, 7), (1, 6), (1, 5), (2, 7), (2, 6), (2, 5), (3, 8), (4, 9), (4, 8), (3, 6), (3, 5), (4, 7), (4, 6), (4, 5), (10, 11), (12, 13), (10, 12), (11, 13), (11, 12), (14, 15), (17, 18), (16, 18), (16, 17), (14, 17), (14, 16), (15, 18), (15, 17), (15, 16), (10, 15), (10, 14), (11, 16), (11, 15), (11, 14), (12, 17), (13, 18), (13, 17), (12, 15), (12, 14), (13, 16), (13, 15), (13, 14), (1, 10), (2, 11), (2, 10), (3, 12), (4, 13), (4, 12), (3, 10), (4, 11), (4, 10), (5, 14), (6, 15), (6, 14), (7, 16), (8, 17), (9, 18), (9, 17), (8, 16), (9, 16), (7, 14), (8, 15), (9, 15), (8, 14), (9, 14), (5, 10), (6, 11), (6, 10), (7, 12), (8, 13), (9, 13), (8, 12), (9, 12), (7, 10), (8, 11), (9, 11), (8, 10), (9, 10), ], + [(1, 2), (3, 4), (1, 3), (2, 4), (2, 3), (5, 6), (8, 9), (7, 9), (7, 8), (5, 8), (5, 7), (6, 9), (6, 8), (6, 7), (1, 6), (1, 5), (2, 7), (2, 6), (2, 5), (3, 8), (4, 9), (4, 8), (3, 6), (3, 5), (4, 7), (4, 6), (4, 5), (10, 11), (13, 14), (12, 14), (12, 13), (10, 13), (10, 12), (11, 14), (11, 13), (11, 12), (15, 16), (18, 19), (17, 19), (17, 18), (15, 18), (15, 17), (16, 19), (16, 18), (16, 17), (10, 15), (11, 16), (11, 15), (12, 17), (13, 18), (14, 19), (14, 18), (13, 17), (14, 17), (12, 15), (13, 16), (14, 16), (13, 15), (14, 15), (1, 11), (1, 10), (2, 12), (2, 11), (2, 10), (3, 13), (4, 14), (4, 13), (3, 11), (3, 10), (4, 12), (4, 11), (4, 10), (5, 15), (6, 16), (6, 15), (7, 17), (8, 18), (9, 19), (9, 18), (8, 17), (9, 17), (7, 15), (8, 16), (9, 16), (8, 15), (9, 15), (5, 10), (6, 11), (6, 10), (7, 12), (8, 13), (9, 14), (9, 13), (8, 12), (9, 12), (7, 10), (8, 11), (9, 11), (8, 10), (9, 10), ], + [(1, 2), (4, 5), (3, 5), (3, 4), (1, 4), (1, 3), (2, 5), (2, 4), (2, 3), (6, 7), (9, 10), (8, 10), (8, 9), (6, 9), (6, 8), (7, 10), (7, 9), (7, 8), (1, 6), (2, 7), (2, 6), (3, 8), (4, 9), (5, 10), (5, 9), (4, 8), (5, 8), (3, 6), (4, 7), (5, 7), (4, 6), (5, 6), (11, 12), (14, 15), (13, 15), (13, 14), (11, 14), (11, 13), (12, 15), (12, 14), (12, 13), (16, 17), (19, 20), (18, 20), (18, 19), (16, 19), (16, 18), (17, 20), (17, 19), (17, 18), (11, 16), (12, 17), (12, 16), (13, 18), (14, 19), (15, 20), (15, 19), (14, 18), (15, 18), (13, 16), (14, 17), (15, 17), (14, 16), (15, 16), (1, 11), (2, 12), (2, 11), (3, 13), (4, 14), (5, 15), (5, 14), (4, 13), (5, 13), (3, 11), (4, 12), (5, 12), (4, 11), (5, 11), (6, 16), (7, 17), (7, 16), (8, 18), (9, 19), (10, 20), (10, 19), (9, 18), (10, 18), (8, 16), (9, 17), (10, 17), (9, 16), (10, 16), (6, 11), (7, 12), (7, 11), (8, 13), (9, 14), (10, 15), (10, 14), (9, 13), (10, 13), (8, 11), (9, 12), (10, 12), (9, 11), (10, 11), ], + [(1, 2), (4, 5), (3, 5), (3, 4), (1, 4), (1, 3), (2, 5), (2, 4), (2, 3), (6, 7), (9, 10), (8, 10), (8, 9), (6, 9), (6, 8), (7, 10), (7, 9), (7, 8), (1, 6), (2, 7), (2, 6), (3, 8), (4, 9), (5, 10), (5, 9), (4, 8), (5, 8), (3, 6), (4, 7), (5, 7), (4, 6), (5, 6), (11, 12), (14, 15), (13, 15), (13, 14), (11, 14), (11, 13), (12, 15), (12, 14), (12, 13), (17, 18), (16, 18), (16, 17), (20, 21), (19, 21), (19, 20), (16, 19), (17, 20), (18, 21), (18, 20), (17, 19), (18, 19), (11, 17), (11, 16), (12, 18), (12, 17), (12, 16), (13, 19), (14, 20), (15, 21), (15, 20), (14, 19), (15, 19), (13, 16), (14, 17), (15, 18), (15, 17), (14, 16), (15, 16), (1, 12), (1, 11), (2, 13), (2, 12), (2, 11), (3, 14), (4, 15), (5, 16), (5, 15), (4, 14), (5, 14), (3, 11), (4, 12), (5, 13), (5, 12), (4, 11), (5, 11), (6, 17), (7, 18), (7, 17), (8, 19), (9, 20), (10, 21), (10, 20), (9, 19), (10, 19), (8, 17), (9, 18), (10, 18), (9, 17), (10, 17), (6, 12), (6, 11), (7, 13), (7, 12), (7, 11), (8, 14), (9, 15), (10, 16), (10, 15), (9, 14), (10, 14), (8, 11), (9, 12), (10, 13), (10, 12), (9, 11), (10, 11), ], + [(1, 2), (4, 5), (3, 5), (3, 4), (1, 4), (1, 3), (2, 5), (2, 4), (2, 3), (7, 8), (6, 8), (6, 7), (10, 11), (9, 11), (9, 10), (6, 9), (7, 10), (8, 11), (8, 10), (7, 9), (8, 9), (1, 7), (1, 6), (2, 8), (2, 7), (2, 6), (3, 9), (4, 10), (5, 11), (5, 10), (4, 9), (5, 9), (3, 6), (4, 7), (5, 8), (5, 7), (4, 6), (5, 6), (12, 13), (15, 16), (14, 16), (14, 15), (12, 15), (12, 14), (13, 16), (13, 15), (13, 14), (18, 19), (17, 19), (17, 18), (21, 22), (20, 22), (20, 21), (17, 20), (18, 21), (19, 22), (19, 21), (18, 20), (19, 20), (12, 18), (12, 17), (13, 19), (13, 18), (13, 17), (14, 20), (15, 21), (16, 22), (16, 21), (15, 20), (16, 20), (14, 17), (15, 18), (16, 19), (16, 18), (15, 17), (16, 17), (1, 12), (2, 13), (2, 12), (3, 14), (4, 15), (5, 16), (5, 15), (4, 14), (5, 14), (3, 12), (4, 13), (5, 13), (4, 12), (5, 12), (6, 17), (7, 18), (8, 19), (8, 18), (7, 17), (8, 17), (9, 20), (10, 21), (11, 22), (11, 21), (10, 20), (11, 20), (9, 17), (10, 18), (11, 19), (11, 18), (10, 17), (11, 17), (6, 12), (7, 13), (8, 14), (8, 13), (7, 12), (8, 12), (9, 15), (10, 16), (11, 16), (10, 15), (11, 15), (9, 12), (10, 13), (11, 14), (11, 13), (10, 12), (11, 12), ], + [(1, 2), (4, 5), (3, 5), (3, 4), (1, 4), (1, 3), (2, 5), (2, 4), (2, 3), (7, 8), (6, 8), (6, 7), (10, 11), (9, 11), (9, 10), (6, 9), (7, 10), (8, 11), (8, 10), (7, 9), (8, 9), (1, 7), (1, 6), (2, 8), (2, 7), (2, 6), (3, 9), (4, 10), (5, 11), (5, 10), (4, 9), (5, 9), (3, 6), (4, 7), (5, 8), (5, 7), (4, 6), (5, 6), (13, 14), (12, 14), (12, 13), (16, 17), (15, 17), (15, 16), (12, 15), (13, 16), (14, 17), (14, 16), (13, 15), (14, 15), (19, 20), (18, 20), (18, 19), (22, 23), (21, 23), (21, 22), (18, 21), (19, 22), (20, 23), (20, 22), (19, 21), (20, 21), (12, 18), (13, 19), (14, 20), (14, 19), (13, 18), (14, 18), (15, 21), (16, 22), (17, 23), (17, 22), (16, 21), (17, 21), (15, 18), (16, 19), (17, 20), (17, 19), (16, 18), (17, 18), (1, 13), (1, 12), (2, 14), (2, 13), (2, 12), (3, 15), (4, 16), (5, 17), (5, 16), (4, 15), (5, 15), (3, 12), (4, 13), (5, 14), (5, 13), (4, 12), (5, 12), (6, 18), (7, 19), (8, 20), (8, 19), (7, 18), (8, 18), (9, 21), (10, 22), (11, 23), (11, 22), (10, 21), (11, 21), (9, 18), (10, 19), (11, 20), (11, 19), (10, 18), (11, 18), (6, 12), (7, 13), (8, 14), (8, 13), (7, 12), (8, 12), (9, 15), (10, 16), (11, 17), (11, 16), (10, 15), (11, 15), (9, 12), (10, 13), (11, 14), (11, 13), (10, 12), (11, 12), ], + [(2, 3), (1, 3), (1, 2), (5, 6), (4, 6), (4, 5), (1, 4), (2, 5), (3, 6), (3, 5), (2, 4), (3, 4), (8, 9), (7, 9), (7, 8), (11, 12), (10, 12), (10, 11), (7, 10), (8, 11), (9, 12), (9, 11), (8, 10), (9, 10), (1, 7), (2, 8), (3, 9), (3, 8), (2, 7), (3, 7), (4, 10), (5, 11), (6, 12), (6, 11), (5, 10), (6, 10), (4, 7), (5, 8), (6, 9), (6, 8), (5, 7), (6, 7), (14, 15), (13, 15), (13, 14), (17, 18), (16, 18), (16, 17), (13, 16), (14, 17), (15, 18), (15, 17), (14, 16), (15, 16), (20, 21), (19, 21), (19, 20), (23, 24), (22, 24), (22, 23), (19, 22), (20, 23), (21, 24), (21, 23), (20, 22), (21, 22), (13, 19), (14, 20), (15, 21), (15, 20), (14, 19), (15, 19), (16, 22), (17, 23), (18, 24), (18, 23), (17, 22), (18, 22), (16, 19), (17, 20), (18, 21), (18, 20), (17, 19), (18, 19), (1, 13), (2, 14), (3, 15), (3, 14), (2, 13), (3, 13), (4, 16), (5, 17), (6, 18), (6, 17), (5, 16), (6, 16), (4, 13), (5, 14), (6, 15), (6, 14), (5, 13), (6, 13), (7, 19), (8, 20), (9, 21), (9, 20), (8, 19), (9, 19), (10, 22), (11, 23), (12, 24), (12, 23), (11, 22), (12, 22), (10, 19), (11, 20), (12, 21), (12, 20), (11, 19), (12, 19), (7, 13), (8, 14), (9, 15), (9, 14), (8, 13), (9, 13), (10, 16), (11, 17), (12, 18), (12, 17), (11, 16), (12, 16), (10, 13), (11, 14), (12, 15), (12, 14), (11, 13), (12, 13), ], + [(2, 3), (1, 3), (1, 2), (5, 6), (4, 6), (4, 5), (1, 4), (2, 5), (3, 6), (3, 5), (2, 4), (3, 4), (8, 9), (7, 9), (7, 8), (11, 12), (10, 12), (10, 11), (7, 10), (8, 11), (9, 12), (9, 11), (8, 10), (9, 10), (1, 7), (2, 8), (3, 9), (3, 8), (2, 7), (3, 7), (4, 10), (5, 11), (6, 12), (6, 11), (5, 10), (6, 10), (4, 7), (5, 8), (6, 9), (6, 8), (5, 7), (6, 7), (14, 15), (13, 15), (13, 14), (17, 18), (16, 18), (16, 17), (13, 16), (14, 17), (15, 18), (15, 17), (14, 16), (15, 16), (20, 21), (19, 21), (19, 20), (22, 23), (24, 25), (22, 24), (23, 25), (23, 24), (19, 23), (19, 22), (20, 24), (21, 25), (21, 24), (20, 22), (21, 23), (21, 22), (13, 20), (13, 19), (14, 21), (15, 22), (15, 21), (14, 19), (15, 20), (15, 19), (16, 23), (17, 24), (18, 25), (18, 24), (17, 23), (18, 23), (16, 20), (16, 19), (17, 21), (18, 22), (18, 21), (17, 19), (18, 20), (18, 19), (1, 14), (1, 13), (2, 15), (3, 16), (3, 15), (2, 13), (3, 14), (3, 13), (4, 17), (5, 18), (6, 19), (6, 18), (5, 17), (6, 17), (4, 14), (4, 13), (5, 15), (6, 16), (6, 15), (5, 13), (6, 14), (6, 13), (7, 20), (8, 21), (9, 22), (9, 21), (8, 20), (9, 20), (10, 23), (11, 24), (12, 25), (12, 24), (11, 23), (12, 23), (10, 20), (11, 21), (12, 22), (12, 21), (11, 20), (12, 20), (7, 14), (7, 13), (8, 15), (9, 16), (9, 15), (8, 13), (9, 14), (9, 13), (10, 17), (11, 18), (12, 19), (12, 18), (11, 17), (12, 17), (10, 14), (10, 13), (11, 15), (12, 16), (12, 15), (11, 13), (12, 14), (12, 13), ], + [(2, 3), (1, 3), (1, 2), (5, 6), (4, 6), (4, 5), (1, 4), (2, 5), (3, 6), (3, 5), (2, 4), (3, 4), (8, 9), (7, 9), (7, 8), (10, 11), (12, 13), (10, 12), (11, 13), (11, 12), (7, 11), (7, 10), (8, 12), (9, 13), (9, 12), (8, 10), (9, 11), (9, 10), (1, 8), (1, 7), (2, 9), (3, 10), (3, 9), (2, 7), (3, 8), (3, 7), (4, 11), (5, 12), (6, 13), (6, 12), (5, 11), (6, 11), (4, 8), (4, 7), (5, 9), (6, 10), (6, 9), (5, 7), (6, 8), (6, 7), (15, 16), (14, 16), (14, 15), (18, 19), (17, 19), (17, 18), (14, 17), (15, 18), (16, 19), (16, 18), (15, 17), (16, 17), (21, 22), (20, 22), (20, 21), (23, 24), (25, 26), (23, 25), (24, 26), (24, 25), (20, 24), (20, 23), (21, 25), (22, 26), (22, 25), (21, 23), (22, 24), (22, 23), (14, 21), (14, 20), (15, 22), (16, 23), (16, 22), (15, 20), (16, 21), (16, 20), (17, 24), (18, 25), (19, 26), (19, 25), (18, 24), (19, 24), (17, 21), (17, 20), (18, 22), (19, 23), (19, 22), (18, 20), (19, 21), (19, 20), (1, 14), (2, 15), (3, 16), (3, 15), (2, 14), (3, 14), (4, 17), (5, 18), (6, 19), (6, 18), (5, 17), (6, 17), (4, 14), (5, 15), (6, 16), (6, 15), (5, 14), (6, 14), (7, 20), (8, 21), (9, 22), (9, 21), (8, 20), (9, 20), (10, 23), (11, 24), (11, 23), (12, 25), (13, 26), (13, 25), (12, 23), (13, 24), (13, 23), (10, 20), (11, 21), (11, 20), (12, 22), (13, 22), (12, 20), (13, 21), (13, 20), (7, 14), (8, 15), (9, 16), (9, 15), (8, 14), (9, 14), (10, 17), (11, 18), (11, 17), (12, 19), (13, 19), (12, 17), (13, 18), (13, 17), (10, 14), (11, 15), (11, 14), (12, 16), (13, 16), (12, 14), (13, 15), (13, 14), ], + [(2, 3), (1, 3), (1, 2), (5, 6), (4, 6), (4, 5), (1, 4), (2, 5), (3, 6), (3, 5), (2, 4), (3, 4), (8, 9), (7, 9), (7, 8), (10, 11), (12, 13), (10, 12), (11, 13), (11, 12), (7, 11), (7, 10), (8, 12), (9, 13), (9, 12), (8, 10), (9, 11), (9, 10), (1, 8), (1, 7), (2, 9), (3, 10), (3, 9), (2, 7), (3, 8), (3, 7), (4, 11), (5, 12), (6, 13), (6, 12), (5, 11), (6, 11), (4, 8), (4, 7), (5, 9), (6, 10), (6, 9), (5, 7), (6, 8), (6, 7), (15, 16), (14, 16), (14, 15), (17, 18), (19, 20), (17, 19), (18, 20), (18, 19), (14, 18), (14, 17), (15, 19), (16, 20), (16, 19), (15, 17), (16, 18), (16, 17), (22, 23), (21, 23), (21, 22), (24, 25), (26, 27), (24, 26), (25, 27), (25, 26), (21, 25), (21, 24), (22, 26), (23, 27), (23, 26), (22, 24), (23, 25), (23, 24), (14, 21), (15, 22), (16, 23), (16, 22), (15, 21), (16, 21), (17, 24), (18, 25), (18, 24), (19, 26), (20, 27), (20, 26), (19, 24), (20, 25), (20, 24), (17, 21), (18, 22), (18, 21), (19, 23), (20, 23), (19, 21), (20, 22), (20, 21), (1, 15), (1, 14), (2, 16), (3, 17), (3, 16), (2, 14), (3, 15), (3, 14), (4, 18), (5, 19), (6, 20), (6, 19), (5, 18), (6, 18), (4, 15), (4, 14), (5, 16), (6, 17), (6, 16), (5, 14), (6, 15), (6, 14), (7, 21), (8, 22), (9, 23), (9, 22), (8, 21), (9, 21), (10, 24), (11, 25), (11, 24), (12, 26), (13, 27), (13, 26), (12, 24), (13, 25), (13, 24), (10, 21), (11, 22), (11, 21), (12, 23), (13, 23), (12, 21), (13, 22), (13, 21), (7, 14), (8, 15), (9, 16), (9, 15), (8, 14), (9, 14), (10, 17), (11, 18), (11, 17), (12, 19), (13, 20), (13, 19), (12, 17), (13, 18), (13, 17), (10, 14), (11, 15), (11, 14), (12, 16), (13, 16), (12, 14), (13, 15), (13, 14), ], + [(2, 3), (1, 3), (1, 2), (4, 5), (6, 7), (4, 6), (5, 7), (5, 6), (1, 5), (1, 4), (2, 6), (3, 7), (3, 6), (2, 4), (3, 5), (3, 4), (9, 10), (8, 10), (8, 9), (11, 12), (13, 14), (11, 13), (12, 14), (12, 13), (8, 12), (8, 11), (9, 13), (10, 14), (10, 13), (9, 11), (10, 12), (10, 11), (1, 8), (2, 9), (3, 10), (3, 9), (2, 8), (3, 8), (4, 11), (5, 12), (5, 11), (6, 13), (7, 14), (7, 13), (6, 11), (7, 12), (7, 11), (4, 8), (5, 9), (5, 8), (6, 10), (7, 10), (6, 8), (7, 9), (7, 8), (16, 17), (15, 17), (15, 16), (18, 19), (20, 21), (18, 20), (19, 21), (19, 20), (15, 19), (15, 18), (16, 20), (17, 21), (17, 20), (16, 18), (17, 19), (17, 18), (23, 24), (22, 24), (22, 23), (25, 26), (27, 28), (25, 27), (26, 28), (26, 27), (22, 26), (22, 25), (23, 27), (24, 28), (24, 27), (23, 25), (24, 26), (24, 25), (15, 22), (16, 23), (17, 24), (17, 23), (16, 22), (17, 22), (18, 25), (19, 26), (19, 25), (20, 27), (21, 28), (21, 27), (20, 25), (21, 26), (21, 25), (18, 22), (19, 23), (19, 22), (20, 24), (21, 24), (20, 22), (21, 23), (21, 22), (1, 15), (2, 16), (3, 17), (3, 16), (2, 15), (3, 15), (4, 18), (5, 19), (5, 18), (6, 20), (7, 21), (7, 20), (6, 18), (7, 19), (7, 18), (4, 15), (5, 16), (5, 15), (6, 17), (7, 17), (6, 15), (7, 16), (7, 15), (8, 22), (9, 23), (10, 24), (10, 23), (9, 22), (10, 22), (11, 25), (12, 26), (12, 25), (13, 27), (14, 28), (14, 27), (13, 25), (14, 26), (14, 25), (11, 22), (12, 23), (12, 22), (13, 24), (14, 24), (13, 22), (14, 23), (14, 22), (8, 15), (9, 16), (10, 17), (10, 16), (9, 15), (10, 15), (11, 18), (12, 19), (12, 18), (13, 20), (14, 21), (14, 20), (13, 18), (14, 19), (14, 18), (11, 15), (12, 16), (12, 15), (13, 17), (14, 17), (13, 15), (14, 16), (14, 15), ], + [(2, 3), (1, 3), (1, 2), (4, 5), (6, 7), (4, 6), (5, 7), (5, 6), (1, 5), (1, 4), (2, 6), (3, 7), (3, 6), (2, 4), (3, 5), (3, 4), (9, 10), (8, 10), (8, 9), (11, 12), (13, 14), (11, 13), (12, 14), (12, 13), (8, 12), (8, 11), (9, 13), (10, 14), (10, 13), (9, 11), (10, 12), (10, 11), (1, 8), (2, 9), (3, 10), (3, 9), (2, 8), (3, 8), (4, 11), (5, 12), (5, 11), (6, 13), (7, 14), (7, 13), (6, 11), (7, 12), (7, 11), (4, 8), (5, 9), (5, 8), (6, 10), (7, 10), (6, 8), (7, 9), (7, 8), (16, 17), (15, 17), (15, 16), (18, 19), (20, 21), (18, 20), (19, 21), (19, 20), (15, 19), (15, 18), (16, 20), (17, 21), (17, 20), (16, 18), (17, 19), (17, 18), (22, 23), (24, 25), (22, 24), (23, 25), (23, 24), (26, 27), (28, 29), (26, 28), (27, 29), (27, 28), (22, 26), (23, 27), (23, 26), (24, 28), (25, 29), (25, 28), (24, 26), (25, 27), (25, 26), (15, 23), (15, 22), (16, 24), (17, 25), (17, 24), (16, 22), (17, 23), (17, 22), (18, 26), (19, 27), (19, 26), (20, 28), (21, 29), (21, 28), (20, 26), (21, 27), (21, 26), (18, 22), (19, 23), (19, 22), (20, 24), (21, 25), (21, 24), (20, 22), (21, 23), (21, 22), (1, 16), (1, 15), (2, 17), (3, 18), (3, 17), (2, 15), (3, 16), (3, 15), (4, 19), (5, 20), (5, 19), (6, 21), (7, 22), (7, 21), (6, 19), (7, 20), (7, 19), (4, 15), (5, 16), (5, 15), (6, 17), (7, 18), (7, 17), (6, 15), (7, 16), (7, 15), (8, 23), (9, 24), (10, 25), (10, 24), (9, 23), (10, 23), (11, 26), (12, 27), (12, 26), (13, 28), (14, 29), (14, 28), (13, 26), (14, 27), (14, 26), (11, 23), (12, 24), (12, 23), (13, 25), (14, 25), (13, 23), (14, 24), (14, 23), (8, 16), (8, 15), (9, 17), (10, 18), (10, 17), (9, 15), (10, 16), (10, 15), (11, 19), (12, 20), (12, 19), (13, 21), (14, 22), (14, 21), (13, 19), (14, 20), (14, 19), (11, 15), (12, 16), (12, 15), (13, 17), (14, 18), (14, 17), (13, 15), (14, 16), (14, 15), ], + [(2, 3), (1, 3), (1, 2), (4, 5), (6, 7), (4, 6), (5, 7), (5, 6), (1, 5), (1, 4), (2, 6), (3, 7), (3, 6), (2, 4), (3, 5), (3, 4), (8, 9), (10, 11), (8, 10), (9, 11), (9, 10), (12, 13), (14, 15), (12, 14), (13, 15), (13, 14), (8, 12), (9, 13), (9, 12), (10, 14), (11, 15), (11, 14), (10, 12), (11, 13), (11, 12), (1, 9), (1, 8), (2, 10), (3, 11), (3, 10), (2, 8), (3, 9), (3, 8), (4, 12), (5, 13), (5, 12), (6, 14), (7, 15), (7, 14), (6, 12), (7, 13), (7, 12), (4, 8), (5, 9), (5, 8), (6, 10), (7, 11), (7, 10), (6, 8), (7, 9), (7, 8), (17, 18), (16, 18), (16, 17), (19, 20), (21, 22), (19, 21), (20, 22), (20, 21), (16, 20), (16, 19), (17, 21), (18, 22), (18, 21), (17, 19), (18, 20), (18, 19), (23, 24), (25, 26), (23, 25), (24, 26), (24, 25), (27, 28), (29, 30), (27, 29), (28, 30), (28, 29), (23, 27), (24, 28), (24, 27), (25, 29), (26, 30), (26, 29), (25, 27), (26, 28), (26, 27), (16, 24), (16, 23), (17, 25), (18, 26), (18, 25), (17, 23), (18, 24), (18, 23), (19, 27), (20, 28), (20, 27), (21, 29), (22, 30), (22, 29), (21, 27), (22, 28), (22, 27), (19, 23), (20, 24), (20, 23), (21, 25), (22, 26), (22, 25), (21, 23), (22, 24), (22, 23), (1, 16), (2, 17), (3, 18), (3, 17), (2, 16), (3, 16), (4, 19), (5, 20), (5, 19), (6, 21), (7, 22), (7, 21), (6, 19), (7, 20), (7, 19), (4, 16), (5, 17), (5, 16), (6, 18), (7, 18), (6, 16), (7, 17), (7, 16), (8, 23), (9, 24), (9, 23), (10, 25), (11, 26), (11, 25), (10, 23), (11, 24), (11, 23), (12, 27), (13, 28), (13, 27), (14, 29), (15, 30), (15, 29), (14, 27), (15, 28), (15, 27), (12, 23), (13, 24), (13, 23), (14, 25), (15, 26), (15, 25), (14, 23), (15, 24), (15, 23), (8, 16), (9, 17), (9, 16), (10, 18), (11, 19), (11, 18), (10, 16), (11, 17), (11, 16), (12, 20), (13, 21), (13, 20), (14, 22), (15, 22), (14, 20), (15, 21), (15, 20), (12, 16), (13, 17), (13, 16), (14, 18), (15, 19), (15, 18), (14, 16), (15, 17), (15, 16), ], + [(2, 3), (1, 3), (1, 2), (4, 5), (6, 7), (4, 6), (5, 7), (5, 6), (1, 5), (1, 4), (2, 6), (3, 7), (3, 6), (2, 4), (3, 5), (3, 4), (8, 9), (10, 11), (8, 10), (9, 11), (9, 10), (12, 13), (14, 15), (12, 14), (13, 15), (13, 14), (8, 12), (9, 13), (9, 12), (10, 14), (11, 15), (11, 14), (10, 12), (11, 13), (11, 12), (1, 9), (1, 8), (2, 10), (3, 11), (3, 10), (2, 8), (3, 9), (3, 8), (4, 12), (5, 13), (5, 12), (6, 14), (7, 15), (7, 14), (6, 12), (7, 13), (7, 12), (4, 8), (5, 9), (5, 8), (6, 10), (7, 11), (7, 10), (6, 8), (7, 9), (7, 8), (16, 17), (18, 19), (16, 18), (17, 19), (17, 18), (20, 21), (22, 23), (20, 22), (21, 23), (21, 22), (16, 20), (17, 21), (17, 20), (18, 22), (19, 23), (19, 22), (18, 20), (19, 21), (19, 20), (24, 25), (26, 27), (24, 26), (25, 27), (25, 26), (28, 29), (30, 31), (28, 30), (29, 31), (29, 30), (24, 28), (25, 29), (25, 28), (26, 30), (27, 31), (27, 30), (26, 28), (27, 29), (27, 28), (16, 24), (17, 25), (17, 24), (18, 26), (19, 27), (19, 26), (18, 24), (19, 25), (19, 24), (20, 28), (21, 29), (21, 28), (22, 30), (23, 31), (23, 30), (22, 28), (23, 29), (23, 28), (20, 24), (21, 25), (21, 24), (22, 26), (23, 27), (23, 26), (22, 24), (23, 25), (23, 24), (1, 17), (1, 16), (2, 18), (3, 19), (3, 18), (2, 16), (3, 17), (3, 16), (4, 20), (5, 21), (5, 20), (6, 22), (7, 23), (7, 22), (6, 20), (7, 21), (7, 20), (4, 16), (5, 17), (5, 16), (6, 18), (7, 19), (7, 18), (6, 16), (7, 17), (7, 16), (8, 24), (9, 25), (9, 24), (10, 26), (11, 27), (11, 26), (10, 24), (11, 25), (11, 24), (12, 28), (13, 29), (13, 28), (14, 30), (15, 31), (15, 30), (14, 28), (15, 29), (15, 28), (12, 24), (13, 25), (13, 24), (14, 26), (15, 27), (15, 26), (14, 24), (15, 25), (15, 24), (8, 16), (9, 17), (9, 16), (10, 18), (11, 19), (11, 18), (10, 16), (11, 17), (11, 16), (12, 20), (13, 21), (13, 20), (14, 22), (15, 23), (15, 22), (14, 20), (15, 21), (15, 20), (12, 16), (13, 17), (13, 16), (14, 18), (15, 19), (15, 18), (14, 16), (15, 17), (15, 16), ], + [(1, 2), (3, 4), (1, 3), (2, 4), (2, 3), (5, 6), (7, 8), (5, 7), (6, 8), (6, 7), (1, 5), (2, 6), (2, 5), (3, 7), (4, 8), (4, 7), (3, 5), (4, 6), (4, 5), (9, 10), (11, 12), (9, 11), (10, 12), (10, 11), (13, 14), (15, 16), (13, 15), (14, 16), (14, 15), (9, 13), (10, 14), (10, 13), (11, 15), (12, 16), (12, 15), (11, 13), (12, 14), (12, 13), (1, 9), (2, 10), (2, 9), (3, 11), (4, 12), (4, 11), (3, 9), (4, 10), (4, 9), (5, 13), (6, 14), (6, 13), (7, 15), (8, 16), (8, 15), (7, 13), (8, 14), (8, 13), (5, 9), (6, 10), (6, 9), (7, 11), (8, 12), (8, 11), (7, 9), (8, 10), (8, 9), (17, 18), (19, 20), (17, 19), (18, 20), (18, 19), (21, 22), (23, 24), (21, 23), (22, 24), (22, 23), (17, 21), (18, 22), (18, 21), (19, 23), (20, 24), (20, 23), (19, 21), (20, 22), (20, 21), (25, 26), (27, 28), (25, 27), (26, 28), (26, 27), (29, 30), (31, 32), (29, 31), (30, 32), (30, 31), (25, 29), (26, 30), (26, 29), (27, 31), (28, 32), (28, 31), (27, 29), (28, 30), (28, 29), (17, 25), (18, 26), (18, 25), (19, 27), (20, 28), (20, 27), (19, 25), (20, 26), (20, 25), (21, 29), (22, 30), (22, 29), (23, 31), (24, 32), (24, 31), (23, 29), (24, 30), (24, 29), (21, 25), (22, 26), (22, 25), (23, 27), (24, 28), (24, 27), (23, 25), (24, 26), (24, 25), (1, 17), (2, 18), (2, 17), (3, 19), (4, 20), (4, 19), (3, 17), (4, 18), (4, 17), (5, 21), (6, 22), (6, 21), (7, 23), (8, 24), (8, 23), (7, 21), (8, 22), (8, 21), (5, 17), (6, 18), (6, 17), (7, 19), (8, 20), (8, 19), (7, 17), (8, 18), (8, 17), (9, 25), (10, 26), (10, 25), (11, 27), (12, 28), (12, 27), (11, 25), (12, 26), (12, 25), (13, 29), (14, 30), (14, 29), (15, 31), (16, 32), (16, 31), (15, 29), (16, 30), (16, 29), (13, 25), (14, 26), (14, 25), (15, 27), (16, 28), (16, 27), (15, 25), (16, 26), (16, 25), (9, 17), (10, 18), (10, 17), (11, 19), (12, 20), (12, 19), (11, 17), (12, 18), (12, 17), (13, 21), (14, 22), (14, 21), (15, 23), (16, 24), (16, 23), (15, 21), (16, 22), (16, 21), (13, 17), (14, 18), (14, 17), (15, 19), (16, 20), (16, 19), (15, 17), (16, 18), (16, 17), ], +] + +@generated function tuplesort(t::NTuple{N}, lt, by, rev) where {N} + if N < length(swaps) + return tuplesortthunk(swaps[N + 1], N) + else + return quote + s = sort!(Base.copymutable(t); lt=lt, by=by, rev=rev) + return ($([:(s[$n]) for n = 1:N]...),) + end + end +end + +function tuplesortthunk(swaps, N) + vars = [Symbol(:t,n) for n = 1:N] + norev_thunk = Expr(:block) + for (i, j) in swaps + a = vars[i] + b = vars[j] + append!(norev_thunk.args, (quote + c = lt(by($a), by($b)) + ($a, $b) = (ifelse(c, $a, $b), ifelse(c, $b, $a)) + end).args) + end + rev_thunk = Expr(:block) + for (i, j) in swaps + a = vars[i] + b = vars[j] + append!(rev_thunk.args, (quote + c = lt(by($a), by($b)) + ($a, $b) = (ifelse(c, $b, $a), ifelse(c, $a, $b)) + end).args) + end + return quote + ($(vars...),) = t + if rev + $rev_thunk + else + $norev_thunk + end + return ($(vars...),) + end +end diff --git a/test/sorting.jl b/test/sorting.jl index 8b58a2d2620ef..b8b65a09384dd 100644 --- a/test/sorting.jl +++ b/test/sorting.jl @@ -398,4 +398,58 @@ end end end +@testset "tuplesort" begin + function mypermutations(things) + if length(things) <= 1 + return [things] + end + perms = [] + for i in 1:length(things) + for rest in mypermutations((things[1:i - 1]..., things[i + 1:end]...)) + push!(perms, (things[i], rest...)) + end + end + return perms + end + + for n = 0:8 + s = ((1:n)...,) + for t in mypermutations(s) + @test sort(t) == s + @test sort(t, by = -) == reverse(s) + @test sort(t, lt = >) == reverse(s) + @test sort(t, by = -, lt = >) == s + @test sort(t, rev=true) == reverse(s) + @test sort(t, by = -, rev=true) == s + @test sort(t, lt = >, rev=true) == s + @test sort(t, by = -, lt = >, rev=true) == reverse(s) + end + end + for n = 9:33 + for _ in 1:100 + s = ((1:n)...,) + t = (randperm(n)...,) + @test sort(t) == s + @test sort(t, by = -) == reverse(s) + @test sort(t, lt = >) == reverse(s) + @test sort(t, by = -, lt = >) == s + @test sort(t, rev=true) == reverse(s) + @test sort(t, by = -, rev=true) == s + @test sort(t, lt = >, rev=true) == s + @test sort(t, by = -, lt = >, rev=true) == reverse(s) + end + end + + s = ((1:3)...) + @test typeof(sort(s)) == typeof(s) + s = ((1:64)...) + @test typeof(sort(s)) == typeof(s) + s = reverse(Float.((1:64)...)) + @test sort(s) == Float.((1:64)...) + @test typeof(sort(s)) == typeof(s) + s = reverse(Float.((1:3)...)) + @test typeof(sort(s)) == typeof(s) + @test sort(s) == Float.((1:3)... +end + end From 26fce37093f749534bb5a39c534d639604a92f74 Mon Sep 17 00:00:00 2001 From: Peter Ahrens Date: Fri, 26 Jul 2019 17:24:27 -0400 Subject: [PATCH 2/3] Let's sort tuples! --- base/sorttuple.jl | 22 +++++++++++----------- test/sorting.jl | 12 ++++++------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/base/sorttuple.jl b/base/sorttuple.jl index 69a0c156187e1..edb5a1eef7a84 100644 --- a/base/sorttuple.jl +++ b/base/sorttuple.jl @@ -39,17 +39,6 @@ swaps = [ [(1, 2), (3, 4), (1, 3), (2, 4), (2, 3), (5, 6), (7, 8), (5, 7), (6, 8), (6, 7), (1, 5), (2, 6), (2, 5), (3, 7), (4, 8), (4, 7), (3, 5), (4, 6), (4, 5), (9, 10), (11, 12), (9, 11), (10, 12), (10, 11), (13, 14), (15, 16), (13, 15), (14, 16), (14, 15), (9, 13), (10, 14), (10, 13), (11, 15), (12, 16), (12, 15), (11, 13), (12, 14), (12, 13), (1, 9), (2, 10), (2, 9), (3, 11), (4, 12), (4, 11), (3, 9), (4, 10), (4, 9), (5, 13), (6, 14), (6, 13), (7, 15), (8, 16), (8, 15), (7, 13), (8, 14), (8, 13), (5, 9), (6, 10), (6, 9), (7, 11), (8, 12), (8, 11), (7, 9), (8, 10), (8, 9), (17, 18), (19, 20), (17, 19), (18, 20), (18, 19), (21, 22), (23, 24), (21, 23), (22, 24), (22, 23), (17, 21), (18, 22), (18, 21), (19, 23), (20, 24), (20, 23), (19, 21), (20, 22), (20, 21), (25, 26), (27, 28), (25, 27), (26, 28), (26, 27), (29, 30), (31, 32), (29, 31), (30, 32), (30, 31), (25, 29), (26, 30), (26, 29), (27, 31), (28, 32), (28, 31), (27, 29), (28, 30), (28, 29), (17, 25), (18, 26), (18, 25), (19, 27), (20, 28), (20, 27), (19, 25), (20, 26), (20, 25), (21, 29), (22, 30), (22, 29), (23, 31), (24, 32), (24, 31), (23, 29), (24, 30), (24, 29), (21, 25), (22, 26), (22, 25), (23, 27), (24, 28), (24, 27), (23, 25), (24, 26), (24, 25), (1, 17), (2, 18), (2, 17), (3, 19), (4, 20), (4, 19), (3, 17), (4, 18), (4, 17), (5, 21), (6, 22), (6, 21), (7, 23), (8, 24), (8, 23), (7, 21), (8, 22), (8, 21), (5, 17), (6, 18), (6, 17), (7, 19), (8, 20), (8, 19), (7, 17), (8, 18), (8, 17), (9, 25), (10, 26), (10, 25), (11, 27), (12, 28), (12, 27), (11, 25), (12, 26), (12, 25), (13, 29), (14, 30), (14, 29), (15, 31), (16, 32), (16, 31), (15, 29), (16, 30), (16, 29), (13, 25), (14, 26), (14, 25), (15, 27), (16, 28), (16, 27), (15, 25), (16, 26), (16, 25), (9, 17), (10, 18), (10, 17), (11, 19), (12, 20), (12, 19), (11, 17), (12, 18), (12, 17), (13, 21), (14, 22), (14, 21), (15, 23), (16, 24), (16, 23), (15, 21), (16, 22), (16, 21), (13, 17), (14, 18), (14, 17), (15, 19), (16, 20), (16, 19), (15, 17), (16, 18), (16, 17), ], ] -@generated function tuplesort(t::NTuple{N}, lt, by, rev) where {N} - if N < length(swaps) - return tuplesortthunk(swaps[N + 1], N) - else - return quote - s = sort!(Base.copymutable(t); lt=lt, by=by, rev=rev) - return ($([:(s[$n]) for n = 1:N]...),) - end - end -end - function tuplesortthunk(swaps, N) vars = [Symbol(:t,n) for n = 1:N] norev_thunk = Expr(:block) @@ -80,3 +69,14 @@ function tuplesortthunk(swaps, N) return ($(vars...),) end end + +@generated function tuplesort(t::NTuple{N}, lt, by, rev) where {N} + if N < length(swaps) + return tuplesortthunk(swaps[N + 1], N) + else + return quote + s = sort!(Base.copymutable(t); lt=lt, by=by, rev=rev) + return ($([:(s[$n]) for n = 1:N]...),) + end + end +end diff --git a/test/sorting.jl b/test/sorting.jl index b8b65a09384dd..47df83ec38ef6 100644 --- a/test/sorting.jl +++ b/test/sorting.jl @@ -440,16 +440,16 @@ end end end - s = ((1:3)...) + s = ((1:3)...,) @test typeof(sort(s)) == typeof(s) - s = ((1:64)...) + s = ((1:64)...,) @test typeof(sort(s)) == typeof(s) - s = reverse(Float.((1:64)...)) - @test sort(s) == Float.((1:64)...) + s = reverse(Float64.(((1:64)...,))) + @test sort(s) == Float64.(((1:64)...,)) @test typeof(sort(s)) == typeof(s) - s = reverse(Float.((1:3)...)) + s = reverse(Float64.(((1:3)...,))) @test typeof(sort(s)) == typeof(s) - @test sort(s) == Float.((1:3)... + @test sort(s) == Float64.(((1:3)...,)) end end From 9bf3185e89986b0ba10410f66d283b36d2aef4c4 Mon Sep 17 00:00:00 2001 From: Peter Ahrens Date: Sun, 28 Jul 2019 21:27:59 -0400 Subject: [PATCH 3/3] tweaks --- base/sorttuple.jl | 23 +++++------------------ test/sorting.jl | 2 +- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/base/sorttuple.jl b/base/sorttuple.jl index edb5a1eef7a84..225413b25b2cd 100644 --- a/base/sorttuple.jl +++ b/base/sorttuple.jl @@ -41,31 +41,18 @@ swaps = [ function tuplesortthunk(swaps, N) vars = [Symbol(:t,n) for n = 1:N] - norev_thunk = Expr(:block) + thunk = Expr(:block) for (i, j) in swaps a = vars[i] b = vars[j] - append!(norev_thunk.args, (quote - c = lt(by($a), by($b)) + append!(thunk.args, (quote + c = lt(by($a), by($b)) != rev ($a, $b) = (ifelse(c, $a, $b), ifelse(c, $b, $a)) end).args) end - rev_thunk = Expr(:block) - for (i, j) in swaps - a = vars[i] - b = vars[j] - append!(rev_thunk.args, (quote - c = lt(by($a), by($b)) - ($a, $b) = (ifelse(c, $b, $a), ifelse(c, $a, $b)) - end).args) - end return quote ($(vars...),) = t - if rev - $rev_thunk - else - $norev_thunk - end + $thunk return ($(vars...),) end end @@ -76,7 +63,7 @@ end else return quote s = sort!(Base.copymutable(t); lt=lt, by=by, rev=rev) - return ($([:(s[$n]) for n = 1:N]...),) + return @inbounds ($([:(s[$n]) for n = 1:N]...),) end end end diff --git a/test/sorting.jl b/test/sorting.jl index 47df83ec38ef6..53b6044605f5e 100644 --- a/test/sorting.jl +++ b/test/sorting.jl @@ -411,7 +411,7 @@ end end return perms end - + for n = 0:8 s = ((1:n)...,) for t in mypermutations(s)