0
$\begingroup$

The Sort function will by default sort from lowest to highest.

In[1]:= Sort[{3, 1, 4}]
Out[1]= {1, 3, 4}

However, if the list contains non-numerical values, it will sort it incorrectly

In[2]:= zeroes = {2 Pi - 2 ArcTan[Sqrt[2 + Sqrt[5]]], 
   2 ArcTan[Sqrt[2 + Sqrt[5]]], 2 Pi + 2 ArcTan[Sqrt[2 + Sqrt[5]]]};

In[3]:= zeroes // N
Out[3]= {4.04615, 2.23704, 8.52022}

In[4]:= Sort[zeroes] // N
Out[4]= {4.04615, 2.23704, 8.52022}

One could use the Greater function as a parameter to Sort and then reverse the input

In[5]:= Reverse@Sort[zeroes, Greater] // N
Out[5]= {2.23704, 4.04615, 8.52022}

There is no Lesser function in Mathematica, but there must be a better way to do this, without converting the data to floats.

$\endgroup$
2
  • 1
    $\begingroup$ This is shown in the last two examples under Scope on the manual page for Sort. $\endgroup$
    – Michael E2
    Commented Mar 10, 2014 at 10:20
  • $\begingroup$ As Michael E2 states, in the documentation. If you're trying to avoid conversion for say performance, makes no difference, when using e.g. Less on expressions, they're evaluated to numeric where possible. $\endgroup$
    – ciao
    Commented Mar 10, 2014 at 10:37

2 Answers 2

5
$\begingroup$

The function Less is what you can use.

list = {2 Pi - 2 ArcTan[Sqrt[2 + Sqrt[5]]], 
   2 ArcTan[Sqrt[2 + Sqrt[5]]], 2 Pi + 2 ArcTan[Sqrt[2 + Sqrt[5]]]};
Sort[list, Less]

Or,

Sort[list, #1 < #2 &]

Or you could use:

SortBy[list, N@# &]
$\endgroup$
0
1
$\begingroup$
Sort[zeros// N]
(* {2.23704,4.04615,8.52022} *)

Mathematica is doing exactly what it should. You were sorting the expressions...

Ah, ninja'd... As ubpdqn posted, SortBy if you wish to sort (and keep form) of expressions by numeric value.

$\endgroup$
3
  • $\begingroup$ +1 not ninja'd...//N vs ,Less...you 'win' by 2 characters (3 if you count my unnecessary space), am ignoring the first argument :-) $\endgroup$
    – ubpdqn
    Commented Mar 10, 2014 at 10:15
  • $\begingroup$ You're not answering the question which specifically asked for a solution without using conversion to floating point precision. $\endgroup$
    – jVincent
    Commented Mar 10, 2014 at 10:16
  • $\begingroup$ @jVincent: not sure what your point (if any) is, I state quite clearly use of SortBy as also posted by ubodqn gives the expressions...not to mention the OP is quite ambiguous re: exactly what form of result is desired. $\endgroup$
    – ciao
    Commented Mar 10, 2014 at 10:19

Not the answer you're looking for? Browse other questions tagged or ask your own question.