Re: Sort[]
- To: mathgroup at smc.vnet.net
- Subject: [mg8593] Re: [mg8540] Sort[]
- From: David Withoff <withoff>
- Date: Sun, 7 Sep 1997 22:13:12 -0400
- Sender: owner-wri-mathgroup at wolfram.com
> Hello,
>
> I need to Sort[] lists that contain symbols.
>
> I've noticed the following strange feature of Sort[].
> Take a simple list
> myList = {b, -b}; Sort gives a result in canonical order
>
> Sort[myList]
>
> {-b,b} or
>
> Sort[myList, Less]
>
> {b,-b}
>
> Take now a simple list
>
> myList1 = {-b, b}; Then, Sort gives the same correct result
>
> Sort[myList1]
>
> {-b,b}
>
> while Sort[] with Less argument gives incorrect result.
>
> Sort[myList1, Less]
> {-b,b}
>
> Can someone explain what is the problem and how to deal with it?
The Sort function is designed so that elements will be re-ordered
only if the sorting test evaluates to False. Since the elements
here are symbolic, the comparisons Less[b, -b] and Less[-b, b]
will evaluate to themselves (that is, Less[b, -b] just returns
Less[b, -b]), so Sort leaves the original order unchanged.
For example:
In[1]:= Sort[{4,3,2,5,6,5,3,4}, f]
Out[1]= {4, 3, 2, 5, 6, 5, 3, 4}
The order is left alone here because the sorting test f doesn't
have a definition, and so never evaluates to False.
> I also need to work with list where symbols are declared Positive
> (or Negative) etc. For instance, declare c Negative:
>
> Sign[c]^=-1;
> Then,
>
> Sort[{-c, c}] should give {c, -c}
>
> How to Sort those lists? Is there a way to use Sort[]
> or I have to write my own function.
If you don't specify a sorting test, then Sort will use the default
sorting test, which does not call Sign, and will ignore the rule
that you added for Sign[c]. If you want a sorting test that will
use the rules that you have added, you can include that sorting
test in the second argument of Sort, as in
In[2]:= Sign[c]^=-1;
In[3]:= Sort[{-c, c}, Sign[#1] <= Sign[#2] &]
Out[3]= {c, -c}
Dave Withoff
Wolfram Research