Tutoriel:Tri pointu pour une liste

De GeoGebra Manual
Aller à : navigation, rechercher

Si vous désirez trier une liste d'objets GeoGebra, il n'est pas improbable que la manière de trier que vous désirez ne soit pas possible avec la commande Trier.
(Si vous désirez simplement inverser le résultat, vous pouvez utiliser Trier[] en association avec la commande Retourner[]).

Mais dans le cas où le type d'objet n'est pas traité par Trier[] ou que vous désirez un critère de tri complétement différent, cette page peut vous aider dans votre recherche. Si vous avez des difficultés à comprendre l'algorithme, vous pouvez trouver ensuite l'explication et des exemples.

Algorithme

  1. Soit liste la liste que nous voulons trier.
  2. liste_a = Trier[Séquence[(*nombre basé sur Elément[liste, i]*, i), i, 1, Longueur[liste]]]
    Elle correspond à c dans l'explication (la liste d'aide). La *section en gras* est appelée f dans l'explication.
  3. liste_t = Séquence[Elément[liste, y(Elément[liste_a, i])], i, 1, Longueur[liste]]
    C'est la liste triée.

Explication

Pour clarifier la situation, essayons de formuler la demande mathématiquement : Soit une liste (a_1, a_2, \ldots, a_n) \subset X et une application f: X \to \mathbb R, nous voulons trouver une permutation \sigma \in S_n telle que f(a_{\sigma(k)}) \leq f(a_{\sigma(l)}) \; \forall (k,l) \in \mathbb N^2: 1 \leq k \leq l \leq n. Vous pouvez interpréter la permutation \sigma comme une renumérotation telle que (a_{\sigma(1)}, a_{\sigma(2)}, \ldots, a_{\sigma(n)})soit la liste triée.

Ainsi nous devons d'abord établir une application f en adéquation avec notre tri, par exemple :

Exemple: Si nous voulons ordonner une liste de points suivant les valeurs croissantes de leur distance à l'origine, nous avons X := \mathbb R^2 et f((x,y)) := \sqrt{x^2 + y^2}. Dans GeoGebra, f pour un point A peut être Longueur[A], ainsi la *section en gras* dans l'algorithme peut être lue comme Longueur[Elément[liste,i]].
Exemple: Si nous voulons ordonner une liste de cercles suivant les valeurs croissantes de leur rayon, la *section en gras* dans l'algorithme peut être lue comme Rayon[Elément[liste,i]].
Exemple: Une construction complète pour trier une liste de nombres complexes en fonction de leur argument peut être trouvée sur GeoGebra.

L'astuce pour résoudre ce problème avec GeoGebra est d'utiliser la commande existant pour trier une liste de point.
Au lieu de considérer géométriquement un point, nous le considérons simplement comme un couple de nombres.
GeoGebra nous permet de trier ces points par leur abscisse, ainsi nous créons une liste de points \tilde c = (\tilde c_1, \ldots, \tilde c_n) avec \tilde c_k := (f(a_k), k) et trions cette liste. Appelons cette liste triée c = (c_1, \ldots, c_n). Elle nous permet maintenant de construire \sigma, parce que y(c_{\sigma(k)}) = k. En utilisant \sigma nous pouvons ensuite construire la version triée de notre liste originale.


Et pour les noms ?

La démarche précédente peut sembler frustrante, si on veut récupérer la liste ordonnée des noms des objets.
Définissez au départ, la liste des noms (en tant que textes) listeD={"nom1","nom2", ... }.

La liste de l'algorithme ci-dessus, sera alors définie par liste=Séquence[Objet[Elément[listeD, k]], k, 1, Longueur[listeD]].

Une fois, votre liste triée dans la liste_t , vous analysez les rangs de chacun des objets, par la commande : RangNoms=Nettoyer[Unir[Séquence[Séquence[Si[Elément[liste_t, i] ≟ Elément[liste, j], i], i, 1, Longueur[liste]], j, 1, Longueur[liste]]]]

Et maintenant, vous pouvez obtenir la liste ordonnée des noms par la commande :

listeA=Séquence[Elément[listeD, Position[j, RangNoms]], j, 1, Longueur[listeD]] en:Tutorial:Advanced_List_Sorting es:Tutorial:Orden de Listas Avanzado

© 2024 International GeoGebra Institute