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 → ℝ si vuole determinare una permutazione \sigma \in S_n tale che f(a_{\sigma(k)}) \leq f(a_{\sigma(l)}) \; \forall (k,l) \in ℕ^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 una lista di punti \tilde c = (\tilde c_1, \ldots, \tilde c_n) con \tilde c_k := (f(a_k), k) da ordinare. Sia c = (c_1, \ldots, c_n) la lista ordinata. Questa ci consente di costruire \sigma, perchè y(c_{\sigma(k)}) = k. Utilizzando \sigma è quindi possibile costruire la versione ordinata della lista originale.
E per i nomi ?
Supponiamo di avere costruito cinque punti: A
, B
, C
, D
ed E
e di volere ordinare tali punti secondo un certo criterio. Utilizzando lista = {A, B, C, D, E}
l'algoritmo precedentemente illustrato restituisce una lista ordinata secondo le coordinate dei punti, non secondo i rispettivi nomi. Per ordinare i punti secondo i nomi è quindi necessario modificare il precedente algoritmo:
- Sia
lista_n
la lista contenente i nomi degli oggetti da ordinare.
Ad esempio:lista_n = {"nome1", "nome2",...}
. Non dimenticarsi le virgolette: in questo modo il riferimento sarà ai nomi degli oggetti e non al valore degli stessi! - Definiamo la lista da utilizzare nell'algoritmo:
lista=Successione[Oggetto[Elemento[lista_n, k]], k, 1, Lunghezza[lista_n]]
.
. - Per ottenere la lista dei nomi ordinati, basta ora utilizzare il comando:
lista_{ns} = Successione[Elemento[lista_n, y(Elemento[lista_h, i])], i, 1, Lunghezza[lista]]
.
en:Tutorial:Advanced List Sorting es:Tutorial:Orden de Listas Avanzado fr:Tutoriel:Tri pointu pour une liste de:Anleitungen:Listen von beliebigen Elementen sortieren