RE: Friendly Challenge 2: sort by column
- To: mathgroup at smc.vnet.net
- Subject: [mg35058] RE: Friendly Challenge 2: sort by column
- From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
- Date: Thu, 20 Jun 2002 23:55:08 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
My solution is given below which has the following features.
- I do extensive parameter checking.
- I provide for a user specified ordering function.
- My program uses Sort with the default ordering function when possible
(Sort is much faster that way).
Notes:
- It isn't clear what the desired behavior should be when elements in
elements in column (n) are the same, so I didn't worry about that case.
-If you want to allow for things that aren't strictly matrices remove the (
?MatrixQ ).
--------
ColumnSort::usage="ColumnSort[matrix, n] arranges the matrix rows such that
column n is in canonical order. ColumnSort[matrix, n, p] uses ordering
function p to arrange the rows.";
ColumnSort[m_?MatrixQ, 1]:=Sort[m]
ColumnSort[m_?MatrixQ, n_Integer]/; 1<=n<=Last[Dimensions[m]]:=
RotateRight[#,n-1]&/@Sort[RotateLeft[#,n-1]&/@m]
ColumnSort[m_?MatrixQ,n_Integer,p_]/;1<=n<=Last[Dimensions[m]]:=
Sort[m,p[Part[#1,n],Part[#2,n]]&]
-------
You should keep in mind that by default Sort arranges things in canonical
order which may not be numerical order. In the following example ordering
function Less is needed to numerically sort the second column.
m={{65,-5,6},{34,Pi,7},{8,Sqrt[70],8},{12,Sin[2],7}};
ColumnSort[m, 2, Less]
------
Regards,
Ted Ersek
Get Mathematica tips, tricks from
http://www.verbeia.com/mathematica/tips/Tricks.html