# Sort tuple

**URL:** <https://discourse.julialang.org/t/sort-tuple/110730>\
**Category:** Internals & Design\
**Tags:** tuple, sort\
**Created:** [February 25, 2024, 10:10am UTC](https://discourse.julialang.org/t/sort-tuple/110730 "2024-02-25T10:10:09Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![jar1](https://avatars.discourse-cdn.com/v4/letter/j/c0e974/32.png) [@jar1](https://discourse.julialang.org/u/jar1)\
**Post date:** [February 25, 2024, 10:10am UTC](https://discourse.julialang.org/t/sort-tuple/110730/1 "2024-02-25T10:10:09Z")

</div>

Any reason this shouldn’t work?

```julia
julia> sort((1,2,3))
ERROR: MethodError: no method matching sort(::Tuple{Int64, Int64, Int64})

```

---

<div class="post-metadata">

**Author:** ![SteffenPL](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/steffenpl/32/206270_2.png) [@SteffenPL](https://discourse.julialang.org/u/SteffenPL)\
**Post date:** [February 25, 2024, 12:09pm UTC](https://discourse.julialang.org/t/sort-tuple/110730/2 "2024-02-25T12:09:22Z")

</div>

Sorting usually requires to swap elements in the process. That is generally more efficient in `Vectors`, even though it maybe can be optimized for small number of elements.

You can use

```julia
using StaticArrays
x = @SVector rand(10) # or SVector( (1,2,3) )
x = sort(x)

```

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [February 25, 2024, 12:10pm UTC](https://discourse.julialang.org/t/sort-tuple/110730/3 "2024-02-25T12:10:00Z")

</div>

See also [GitHub - tkf/Baselet.jl: Base API optimized for tuples](https://github.com/tkf/Baselet.jl)

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [February 25, 2024, 12:10pm UTC](https://discourse.julialang.org/t/sort-tuple/110730/4 "2024-02-25T12:10:56Z")

</div>

Linking [related Github thread](https://github.com/JuliaLang/julia/issues/31818#issue-436718912).

---

<div class="post-metadata">

**Author:** ![jar1](https://avatars.discourse-cdn.com/v4/letter/j/c0e974/32.png) [@jar1](https://discourse.julialang.org/u/jar1)\
**Post date:** [February 25, 2024, 7:00pm UTC](https://discourse.julialang.org/t/sort-tuple/110730/5 "2024-02-25T19:00:04Z")

</div>

> [@\[ANN\] OptimalSortingNetworks: Sort small collections efficiently and with good type inference](https://discourse.julialang.org/t/ann-optimalsortingnetworks-sort-small-collections-efficiently-and-with-good-type-inference/105544/13):
>
> Yeah, it loses some of the charm of having a super fast Vector sort algorithm if you can’t do it in place.

This package can sort a tuple.

---

<div class="post-metadata">

**Author:** ![aplavin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/aplavin/32/222056_2.png) [@aplavin](https://discourse.julialang.org/u/aplavin)\
**Post date:** [February 25, 2024, 7:24pm UTC](https://discourse.julialang.org/t/sort-tuple/110730/6 "2024-02-25T19:24:45Z")

</div>

Sorting Tuples was added to Julia once, but then removed before it was actually released: [Support sorting iterators by LilithHafner · Pull Request #46104 · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/pull/46104). Maybe that PR could be revived in a more limited form?

---

<div class="post-metadata">

**Author:** ![Alexander\_Knudson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alexander_knudson/32/215656_2.png) [@Alexander\_Knudson](https://discourse.julialang.org/u/Alexander_Knudson)\
**Post date:** [February 26, 2024, 7:52am UTC](https://discourse.julialang.org/t/sort-tuple/110730/7 "2024-02-26T07:52:12Z")

</div>

[TupleTools.jl](https://github.com/Jutho/TupleTools.jl) has a sort method.

---

<div class="post-metadata">

**Author:** ![oxinabox](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oxinabox/32/206603_2.png) [@oxinabox](https://discourse.julialang.org/u/oxinabox)\
**Post date:** [February 26, 2024, 10:05am UTC](https://discourse.julialang.org/t/sort-tuple/110730/8 "2024-02-26T10:05:50Z")

</div>

that was a bit different.  
That was `sort`ing any iterable via making sort fall back to `sort(collect(iter))`  
which will return a `Vector`.  
and it was removed after decided that it was undesirable for an operation like `sort` to just generically return a different type to what it got as input.

idk if for tuples if sort on a tuple would make sense to return a `Vector` or not.  
I lean towards not, and that one should either call collect yourself if you want that.  
or use a sorting network if you don’t

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [February 26, 2024, 10:28am UTC](https://discourse.julialang.org/t/sort-tuple/110730/9 "2024-02-26T10:28:57Z")

</div>

I think having `sort` on tuples returning a tuple makes sense. It was unfortunate that that feature got bundled up in [Support sorting iterators by LilithHafner · Pull Request #46104 · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/pull/46104) which was really about something completely different so it ended up getting reverted along with the rest.

---

<div class="post-metadata">

**Author:** ![JeffreySarnoff](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jeffreysarnoff/32/1980_2.png) [@JeffreySarnoff](https://discourse.julialang.org/u/JeffreySarnoff)\
**Post date:** [February 26, 2024, 10:39am UTC](https://discourse.julialang.org/t/sort-tuple/110730/10 "2024-02-26T10:39:50Z")

</div>

I agree.

---

<div class="post-metadata">

**Author:** ![aplavin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/aplavin/32/222056_2.png) [@aplavin](https://discourse.julialang.org/u/aplavin)\
**Post date:** [February 26, 2024, 2:10pm UTC](https://discourse.julialang.org/t/sort-tuple/110730/11 "2024-02-26T14:10:58Z")

</div>

> [@oxinabox](#):
>
> that was a bit different.  
> That was `sort`ing any iterable via making sort fall back to `sort(collect(iter))`  
> which will return a `Vector`.

For NTuples, that PR returned NTuple and was quite performant.

---

<div class="post-metadata">

**Author:** ![Lilith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lilith/32/27492_2.png) [@Lilith](https://discourse.julialang.org/u/Lilith)\
**Post date:** [December 8, 2024, 9:56pm UTC](https://discourse.julialang.org/t/sort-tuple/110730/12 "2024-12-08T21:56:14Z")

</div>

This should work in 1.12 ([Add sort for NTuples by LilithHafner · Pull Request #54494 · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/pull/54494))
