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..225413b25b2cd --- /dev/null +++ b/base/sorttuple.jl @@ -0,0 +1,69 @@ +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), ], +] + +function tuplesortthunk(swaps, N) + vars = [Symbol(:t,n) for n = 1:N] + thunk = Expr(:block) + for (i, j) in swaps + a = vars[i] + b = vars[j] + append!(thunk.args, (quote + c = lt(by($a), by($b)) != rev + ($a, $b) = (ifelse(c, $a, $b), ifelse(c, $b, $a)) + end).args) + end + return quote + ($(vars...),) = t + $thunk + 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 @inbounds ($([:(s[$n]) for n = 1:N]...),) + end + end +end diff --git a/test/sorting.jl b/test/sorting.jl index 8b58a2d2620ef..53b6044605f5e 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(Float64.(((1:64)...,))) + @test sort(s) == Float64.(((1:64)...,)) + @test typeof(sort(s)) == typeof(s) + s = reverse(Float64.(((1:3)...,))) + @test typeof(sort(s)) == typeof(s) + @test sort(s) == Float64.(((1:3)...,)) +end + end