Ordenar no es el algoritmo, es el criterio
Ordenar, según el diccionario, es poner de una manera específica las cosas, las personas o los sucesos según un criterio o una determinada norma.
La parte técnica de esa frase —"poner de una manera específica"— es la que tiene algoritmos, animaciones y comparaciones de eficiencia. La parte que decide todo es la otra: según un criterio. Y ese criterio no lo pone nunca la máquina.
Los criterios están en todas partes
Una biblioteca se puede ordenar alfabéticamente, por categorías, cronológicamente por fecha de publicación, o por relevancia después de una búsqueda. Ninguno de esos órdenes es más correcto que los demás; cada uno responde a una pregunta distinta.
En Amazon o en MercadoLibre eliges tú: relevancia, precio, valoración del vendedor. Es de las pocas veces que el criterio es visible y ajustable.
En tu feed de Instagram o de Facebook el criterio existe, pesa muchísimo más, y no lo eliges tú. Los parámetros generales son dos: atención y utilidad. Qué le diste like, con quién intercambias más mensajes, qué es popular en tu área, en tu rango de edad, entre gente con tus intereses. Por eso lo primero que ves al abrir la aplicación es casi siempre alguien que ya conoces.
Y por eso, cuando le das refresh, no ves lo mismo. Es deliberado: si siempre ves lo mismo, lo más seguro es que te aburras y te salgas de la red. Toda esa información se la diste tú, con cada like, cada comentario, cada hashtag.
El orden fuera de la pantalla
Ese mismo fin de semana estuve reordenando la planta baja de mi casa —la cocina y el comedor— con el método de La magia del orden de Marie Kondo, mezclado con algunas ideas de minimalismo.
Resultó ser exactamente el mismo problema: no se trata de dónde poner las cosas, se trata de bajo qué criterio decides. Le dediqué su propio texto, incluyendo lo que no me convenció del método.
Cómo se recorre una lista: el ciclo for
Ya que hablamos de los criterios, hablemos de la lista. Para ordenarla primero hay que recorrerla, y para eso existe una de las herramientas más básicas que hay, disponible en cualquier lenguaje: el ciclo for.
En pseudocódigo:
para cada elemento de la lista
realizar una acción con ese elemento
Eso es todo. Un ejemplo: tomamos los números del 1 al 10 y le sumamos uno a cada uno. Terminamos con los números del 2 al 11.
Se puede restringir el recorrido:
para cada elemento de los números del 1 al 10
desde el segundo hasta el penúltimo
sumar uno
Resultado: 1 3 4 5 6 7 8 9 10 10. El primero y el último quedaron intactos.
Se puede recorrer al revés, del último al primero. Se puede recorrer de dos en dos:
para cada elemento de los números del 1 al 10
desde el primero hasta el penúltimo, cada dos elementos
sumar uno
Resultado: 2 2 4 4 6 6 8 8 10 10. Uno sí, uno no.
Y se pueden anidar: recorrer la lista, guardar el elemento actual en una variable, y recorrerla otra vez desde adentro para comparar unos elementos con otros. Eso es exactamente lo que hace falta para ordenar.
Un algoritmo de ordenamiento por intercambio
La idea es simple aunque el pseudocódigo se enrede: dos ciclos for anidados y un condicional.
Tomas el primer elemento de la lista y lo comparas con todos los demás. Cuando encuentras uno menor, los intercambias de posición. Al terminar ese recorrido, el menor de toda la lista quedó en la primera posición.
Pasas a la segunda posición y repites con el resto. Después la tercera, la cuarta, hasta acabar.
Ésta no es la forma más eficiente de ordenar una lista, ni la única. Es la que me pareció más fácil de explicar sin pantalla. Existen quicksort, burbuja y varios más, y vale mucho la pena ver las animaciones que comparan cuántas comparaciones hace cada uno y cuánto tardan; la diferencia entre uno y otro es enorme cuando la lista crece.
Pero fíjate en algo: en toda esa comparación de eficiencia, el criterio —de menor a mayor— se dio por sentado desde el principio. Nadie discute el criterio. Se discute la velocidad para aplicarlo.
Y de ahí la parte incómoda
Cuando empecé a preparar este episodio me encontré un artículo que describía a los algoritmos como injustos y los comparaba desfavorablemente con los sistemas humanos, argumentando que son cajas negras.
Ahí hay dos cosas que valía la pena separar. Una es qué es realmente una caja negra, porque no significa lo que casi todo mundo cree. La otra es que justicia no es la palabra.
Un proceso determinado por estadística o por ecuaciones no es justo ni injusto; hace lo que se le indicó. Lo que sí aplica es responsabilidad, y ésa es completamente humana: quién eligió el algoritmo, quién eligió la base de datos, quién eligió la aplicación, quién eligió los parámetros de entrada. Y si un sistema de contratación acaba prefiriendo hombres, el problema no está en el ordenamiento.
Los algoritmos no son justos ni injustos. Siguen una serie de pasos que nosotros les indicamos. La responsabilidad y la justicia las ponemos nosotros: al elegir el algoritmo, al elegir los datos, al elegir la aplicación, y al elegir usar o no usar un servicio.
Este texto sale del episodio 002 del Podcast Algoritmos.