Tutorial: Orden avanzado de listas
Si deseas ordenar una lista de objetos en GeoGebra, es posible que el tipo de objeto no sea admitido por el comando Ordena. (Si simplemente quieres invertir los resultados, puedes usar Ordena()
junto con Invierte).
En caso de que el tipo de objeto no sea admitido por Ordena()
, o si deses un criterio de ordenamiento totalmente diferente, este tutorial te ayudará. Si tienes inconvenientes con el algoritmo, puedes leer la explicación y los ejemplos más adelante.
Algoritmo
- Sea
lista
la lista que queremos ordenar. lista_h = Ordena(Secuencia[(*número basado en Elemento(lista, i)*, i), i, 1, Longitud(lista)))
Esto corresponde a c en la explicación (la lista auxiliar). La parte en negrita es llamada f en la explicación.lista_s = Secuencia(Elemento(lista, y(Elemento(lista_h, i))), i, 1, Longitud(lista))
Esta es la lista ordenada.
Explicación
Para clarificar la situación, formulemos el problema matemáticamente. Dada la lista (a_1, a_2, \ldots, a_n) \subset X y la relación f: X \to \mathbb R, queremos hallar una permutación \sigma \in S_n tal que f(a_{\sigma(k)}) \leq f(a_{\sigma(l)}) \; \forall (k,l) \in \mathbb N^2: 1 \leq k \leq l \leq n. Podemos interpretar la permutación \sigma como una renumeración tal que (a_{\sigma(1)}, a_{\sigma(2)}, \ldots, a_{\sigma(n)}) será la lista ordenada. De modo que, en primer lugar, necesitamos una relación f para el ordenamiento, por ejemplo:
A
será Longitud(A)
, así que la parte en negrita del algoritmo lucirá Longitud(Elemento(lista,i))
.Radio(Elemento(lista,i))
.El truco para resolver este problema en Geogebra consiste en aprovechar el comando existente para ordenar una lista de puntos. En lugar de pensar en los puntos geométricamente, pensamos en ellos simplemente como pares ordenados de números. GeoGebra nos permite ordenar esos puntos según sus abscisas, así que creamos la lista de puntos \tilde c = (\tilde c_1, \ldots, \tilde c_n) con \tilde c_k := (f(a_k), k) y la ordenamos. Sea la lista ordenada c = (c_1, \ldots, c_n). Esta lista nos permite construir \sigma, porque y(c_{\sigma(k)}) = k. Usando \sigma podemos generar la versión ordenada de nuestra lista original.
¿Y qué sucede con los nombres?
Supongamos que hemos construido cinco puntos llamados A
, B
, C
, D
y E
, y que queremos ordenarlos según cierto criterio. Podemos hacerlo usando lista = {A,B,C,D,E}
y el algoritmo anterior, pero obtendremos una lista ordenada con las coordenas de los puntos, no con sus nombres originales --lo que podría ser interesando en la construcción, o beneficioso para mostrárserlos al usuario--. Para poder acceder a esos nombres en orden deseado debemos extender nuestro algoritmo:
- Sea
lista_n
la lista de los nombres de los objetos que queremos ordenar.
Por ejemplo:lista_n = {"A", "B","C","D","E"}
. No olvides las comillas, ya que necesitamos los nombres de los objetos y no los objetos en sí. - Definamos
lista=Secuencia(Objeto(Elemento(lista_n, k)), k, 1, Longitud(lista_n))
.
Esto crea la lista de objetos que queremos ordenar a partir de la lista de nombres. lista_h = Ordena(Secuencia((*número basado en Elemento(lista, i)*, i), i, 1, Longitud(lista)))
Este es el paso 2 de nuestro algoritmo original.lista_{ns} = Secuencia(Elemento(lista_n, y(Elemento(lista_h, i))), i, 1, Longitu(lista))
Esta es ahora una lista con los nombres de los objetos ordenados, como{"B", "A", "E", "F", "D"}
. Si también deseas la lista ordenada con los valores, puedes utilizarlist_s
tal como se definió en el algoritmo original.