### 6.39.19 Trier : `sort`

`sort` a comme argument une liste ou une expression.

- Pour une liste, `sort` renvoie la liste triée selon l’ordre croissant.
  On tape :
  `sort([3,4,2])`
  On obtient :
  `[2,3,4]`
- Pour une expression, `sort` trie et collecte les termes égaux dans les sommes et produits.
  On tape :
  `sort(exp(2*ln(x))+x*y-x+y*x+2*x)`
  On obtient :
  `2*x*y+exp(2*ln(x))+x`
  On tape :
  `simplifier(exp(2*ln(x))+x*y-x+y*x+2*x)`
  On obtient :
  `x```^```2+2*x*y+x`

Remarque
`sort` accepte un 2-ième argument après une liste qui est la fonction de tri, par exemple (x,y)->x>y pour avoir la liste triée selon l’ordre décroissant.
Attention La fonction de tri f doit définir un ordre strict faible c’est à dire que

- f(x,y) est un fonction renvoyant 0 (faux) ou 1 (vrai) qui est toujours définie (f doit renvoyer 0 si 2 éléments ne sont pas comparables) et doit vérifier :
- f doit définir une relation transitive (si f(x,y) et f(y,z) sont vrais alors f(x,z) est vrai)
- on ne peut pas avoir f(x,y) et f(y,x) vrai en même temps (antisymétrie non réflexive)
- f ne définit pas forcément une relation d’ordre total, on peut avoir f(x,y) et f(y,x) simultanément faux. Si on définit la relation E par xEy est vrai lorsque f(x,y) et f(y,x) sont simultanément faux alors E doit être une relation d’équivalence.

Sinon l’algorithme employé risque de boucler.... Par exemple, on ne peut pas mettre comme fonction de tri : `(x,y)->x[1]>=y[1]`.

On tape :

`sort([3,4,2],(x,y)->x>y)`

On obtient :

`[4,3,2]`

`sort` ne trie pas des listes de listes, il faut donc lui passer une fonction de tri, par exemple par ordre décroissant de la 2ième colonne ou de la première en cas d’égalité. On tape :

`sort([[1,2],[2,3],[4,3]],
(x,y)->when(x[1]==y[1],x[0]>y[0],x[1]>y[1]))`

On obtient :

`[[4,3],[2,3],[1,2]]`

Attention Dans l’exemple précédent,

- on ne peut pas mettre comme fonction de tri `(x,y)->x[1]>=y[1]` car l’ordre n’est pas strict
- on peut mettre comme fonction de tri `f:=(x,y)->x[1]>y[1]` bien que l’ordre ne soit pas total.

Soient :
`L1:=[[1,2],[2,3],[4,3]]`
`L2:=[[1,2],[4,3],[2,3]]`
Dans ce cas `sort(L1,(x,y)->x[1]>y[1])` et `sort(L2,(x,y)->x[1]>y[1])` renvoient des réponses différentes parce que l’ordre n’est pas total et que `[2,3]` et `[4,3]` sont considérés comme équivalents.