Tutorial:Ordinare gli elementi di una lista
A volte il comando Ordina non è sufficiente per ottenere alcune opzioni avanzate di ordinamento degli oggetti presenti in una lista. (Per ritornare alla situazione iniziale, dopo un ordinamento, basta utilizzare il comando Ordina[]
assieme al comando Inverti[]).
Quando il tipo di oggetti contenuti nella lista non è supportato dal comando Ordina[]
o si desidera utilizzare un criterio di ordinamento completamente diverso da quello implementato, è possibile seguire il procedimento e gli esempi descritti di seguito.
Algoritmo
- Sia
lista
la lista da ordinare. lista_h = Ordina[Successione[(*numero basato su Elemento[lista, i]*, i), i, 1, Lunghezza[lista]]]
Ciò corrisponde a c nella Spiegazione. La parte di testo in grassetto si riferisce a f nella Spiegazione.lista_s = Successione[Elemento[lista, y(Elemento[lista_h, i])], i, 1, Lunghezza[lista]]
Ecco la lista ordinata.
Spiegazione
Riformuliano in termini matematici la questione: data una lista (a_1, a_2, \ldots, a_n) \subset X e un'applicazione f: X \to \mathbb R si vuole determinare una permutazione \sigma \in S_n tale che f(a_{\sigma(k)}) \leq f(a_{\sigma(l)}) \; \forall (k,l) \in \mathbb N^2: 1 \leq k \leq l \leq n. Si può pensare alla permutazione \sigma come a una rinumerazione, tale che (a_{\sigma(1)}, a_{\sigma(2)}, \ldots, a_{\sigma(n)}) sarà la lista ordinata.
È innanzitutto necessario determinare un'applicazione f che ci consenta di ottenere un ordinamento corretto:
A
è Lunghezza[A]
, e quindi la parte in grassetto dell'algoritmo diventa in questo caso Lunghezza[Elemento[lista, i]]
.Raggio[Elemento[lista,i]]
.Il trucco per risolvere questo problema in GeoGebra è quello di utilizzare il comando predefinito per ordinare una lista di punti. Invece di pensare a un punto in termini geometrici, conviene pensare ad esso come a una coppia di numeri. GeoGebra allora consente l'ordinamento delle coppie rispetto all'ascissa, in modo da ottenere allows us to sort those points by their x-coordinates, so we create a list of points \tilde c = (\tilde c_1, \ldots, \tilde c_n) with \tilde c_k := (f(a_k), k) and sort this list. Let's call the sorted list c = (c_1, \ldots, c_n). This sorted list now allows us to construct \sigma, because y(c_{\sigma(k)}) = k. Using \sigma we can then construct the sorted version of our original list.
And for the names?
Imagine we have constructed five points called A
, B
, C
, D
and E
and we want to sort those points based upon some criterion. Using list = {A,B,C,D,E}
the algorithm above can be used to achieve this, but it will just return a sorted list with the coordinates of the points, not a sorted list with their original names, which could have a meaning in the construction and thus also helpful to display to the user. To also display those names in a sorted manner we have to extend our algorithm slightly:
- Let
list_n
be a list with the names of the objects we want to sort.
For example:list_n = {"A", "B","C","D","E"}
. Do not forget the quotes: We want the names of the objects and not the objects themselves! - Define
list=Sequence[Object[Element[list_n, k]], k, 1, Length[list_n]]
.
This creates the list of objects we want to sort based upon the name list. list_h = Sort[Sequence[(*number based upon Element[list, i]*, i), i, 1, Length[list]]]
This is step 2 of our original algorithm.list_{ns} = Sequence[Element[list_n, y(Element[list_h, i])], i, 1, Length[list]]
This is now a list with the sorted names of the objects, like{"B", "A", "E", "F", "D"}
. If you also want a sorted list with the values you can just uselist_s
as defined in the original algorithm.
es:Tutorial:Orden de Listas Avanzado fr:Tutoriel:Tri pointu pour une liste de:Anleitungen:Listen von beliebigen Elementen sortieren