Algoritmos de Ordenamiento
Los siguientes son los aspectos más importantes y una descripción de los algoritmos expuestos en clase:
Ordenamiento Rápido
Notas importantes
- Utiliza la técnica de divide y vencerás.
- Se utiliza un elemento de pivote elegido de manera aleatoria que se usa como referencia para el funcionamiento del algoritmo.
- De manera usual el pivote es el primer o último elemento de la lista, pero puede ser elegido de manera aleatoria.
- Si la lista es de largo 1 se considera ordenada.
- Se elige el pivote.
- Se coloca el pivote en su posición correcta colocando los valores menores a él y los mayores a él en lados diferentes.
- Repetir los pasos 1-3 de manera recursiva en las sublistas a los lados del pivote.
![]() |
| Simulación de los pasos 1 - 3. |
Ordenamiento de Cajón
Notas importantes
- Es más útil y eficiente cuando los elementos de entrada están uniformemente distribuidos en un rango.
- Se crea un vector vacío que maneja los rangos en que se pueden clasificar los elementos del vector a ordenar.
- Se crea un vector con largo de acuerdo a los rangos en que se van a clasificar los elementos (vector de cajones).
- Se distribuyen los elementos en los diferentes cajones.
- Se utiliza un algoritmo de ordenamiento (eje. inserción) para ordenar los elementos de cada cajón.
- Se reconstituyen los sub-vectores de cada cajón en un sólo vector.
![]() |
| Representación visual de la distribución de elementos en los diferentes cajones. |
Ordenamiento de Inserción
Notas importantes
- Una analogía es el proceso a ordenar los naipes de la mano en un juego de cartas.
- Se utiliza una referencia/índice para definir la parte ordenada conforme se avanza en el algoritmo.
- Se toma el elemento que sigue a la parte ordenada.
- Si es el primer elemento se considera ordenado.
- Alternativamente se puede iniciar con el segundo elemento si el largo de la lista es mayor que 1.
- Se recorre el subvector ordenado para determinar la posición del elemento evaluado.
- Se inserta el elemento en la posición que le corresponde.
- Se ajusta la referencia que determina el subvector ordenado.
- Se repiten los pasos 1 - 4 hasta que el subvector ordenado sea del mismo tamaño que el vector original.
![]() |
| Animación del algoritmo de inserción. |
Ordenamiento de Burbuja
Notas importantes
- Ordenamiento de intercambio más simple.
- Se determina que la lista está ordenada cuando hay un recorrido limpio (sin intercambios).
- Se configura una referencia/índice al inicio del vector.
- Verificar que no sea el final de la lista.
- Se compara el elemento de la posición actual con el siguiente y se determina el mayor o menor dependiendo del tipo de ordenamiento.
- Se incrementa la referencia/índice en 1.
- Se repiten los pasos del 1-4 hasta llegar al final de la lista.
- Se ajusta el nuevo final de la lista, ya que el último elemento se considera ordenado.
- Se repiten los pasos del 1-5 hasta que suceda un recorrido sin intercambios.
![]() | ||
| Simulación del ordenamiento de burbuja con bandera. |
Ordenamiento Heap
Notas importantes
- Utiliza dos funciones para trabajar en un maxHeap:
- crearMaxHeap - contruye un heap de tipo max. Es decir un árbol binario completo donde cada nodo es mayor o igual a sus nodos hijos.
- heapify - para modificar el heap de manera que vuelva a ser un maxHeap cuando se remueve la raíz.
- Con el maxHeap se van colocando los valores mayores (o menores si fuera un minHeap) al final del subvector no ordenado hasta que el heap esté vacío.
- Se crea un maxHeap o minHeap.
- Se coloca una referencia/índice al final del vector no ordenado para ir introduciendo el elemento mayor/menor del heap.
- Se coloca la raíz al final de la lista y el último nodo del heap en la raíz.
- Se ajusta la referencia/índice una posición menos que sería el nuevo final del subvector no ordenado.
- Se realiza un heapify.
- Se repiten los pasos del 3 - 5, hasta que el heap esté vacío y por lo tanto el vector final está ordenado.
![]() |
| Simulación del ordenamiento heap. |
Ordenamiento de Unión (Merge)
Notas importantes
- Este también se basa en el concepto de divide y vencerás.
- Se realizan dos operaciones sobre el vector inicial y posteriores subvectores: división y merge (en subvectores ordenados).
- Se divide el vector en 2 subvectores: izquierdo y derecho.
- Se continúa dividiendo hasta que ambos sean de largo 1 (se consideran ordenados) y se realiza una unión de ambos subvectores en un nuevo vector ordenado.
- Los subvectores ordenados resultantes se vuelven a unir evaluando la relación de peso de sus elementos para colocarlos en un nuevo subvector ordenado.
- Se repite el paso 3 hasta que se los subvectores unidos devuelvan el vector original ordenado.
![]() | ||||
| Simulación del algoritmo de unión (Merge). |
Ordenamiento Radix
Notas importantes
- Se hacen diferentes pasadas de ordenamiento evaluando diferentes dígitos de cada número conforme el algoritmo progresa.
- Se determina el mayor elemento para saber cuántos dígitos se deben evaluar.
- Se ordenan los elementos de acuerdo al dígito menos significativo (de menor peso).
- Se ordena el vector resultante de acuerdo al dígito de mayor peso siguiente.
- Se repite el paso 3 hasta evaluar todos los dígitos de los elementos del vector.
![]() |
| Imagen que demuestra los diferentes recorridos de ordenamiento sobre los diferentes dígitos de cada número. |
Ejercicio prácticos asignados en clase
Radix - A. [33, 95, 72, 12, 5, 100, 85, 302, 23, 81]
- Se ordena la lista de acuerdo al primer dígito:
- [100, 81, 72, 12, 302, 33, 23, 95, 5, 85]
- Se ordena la lista de acuerdo al segundo dígito:
- [100, 05, 302, 12, 23, 33, 72, 81, 85, 95]
- Se ordena la lista de acuerdo al tercer dígito:
- [005, 012, 023, 033, 072, 081, 085, 095, 100, 302]
- La lista ahora está ordenada:
- [5, 12, 23, 33, 72, 81, 85, 95, 100, 302]
Burbuja - E. [z, l, j, e, r, d, r, o]
- Primer recorrido:
- [l, z, j, e, r, d, r, o]
- [l, j, z, e, r, d, r, o] *Cambio
- [l, j, e, z, r, d, r, o] *Cambio
- [l, j, e, r, z, d, r, o] *Cambio
- [l, j, e, r, d, z, r, o] *Cambio
- [l, j, e, r, d, r, z, o] *Cambio
- [l, j, e, r, d, r, o, z] *Cambio
- Segundo recorrido:
- [l, j, e, r, d, r, o, z]
- [j, l, e, r, d, r, o, z] *Cambio
- [j, e, l, r, d, r, o, z] *Cambio
- [j, e, l, r, d, r, o, z]
- [j, e, l, d, r, r, o, z] *Cambio
- [j, e, l, d, r, r, o, z]
- [j, e, l, d, r, o, r, z] *Cambio
- Tercer recorrido:
- [j, e, l, d, r, o, r, z]
- [e, j, l, d, r, o, r, z] *Cambio
- [e, j, l, d, r, o, r, z]
- [e, j, d, l, r, o, r, z] *Cambio
- [e, j, d, l, r, o, r, z]
- [e, j, d, l, o, r, r, z] *Cambio
- Cuarto recorrido:
- [e, j, d, l, o, r, r, z]
- [e, j, d, l, o, r, r, z]
- [e, d, j, l, o, r, r, z] *Cambio
- [e, d, j, l, o, r, r, z]
- [e, d, j, l, o, r, r, z]
- Quinto recorrido:
- [e, d, j, l, o, r, r, z]
- [d, e, j, l, o, r, r, z] *Cambio
- [d, e, j, l, o, r, r, z]
- [d, e, j, l, o, r, r, z]
- Sexto recorrido:
- [d, e, j, l, o, r, r, z]
- [d, e, j, l, o, r, r, z]
- [d, e, j, l, o, r, r, z]
- Séptimo recorrido:
- [d, e, j, l, o, r, r, z]
- [d, e, j, l, o, r, r, z]
- Lista ordenada
- [d, e, j, l, o, r, r, z]
Merge - G. [505, 404, 606, 101, 707, 808, 202, 909, 303]
- Se divide el arreglo recursivamente y se ordenan los subvectores:
- [505, 404, 606, 101, 707, 808, 202, 909, 30]
- [505, 404, 606, 101, 707] [808, 202, 909, 303]
- [505, 404, 606] [101, 707] [808, 202, 909, 303]
- [505, 404] [606] [101, 707] [808, 202, 909, 303]
- [505] [404] [606] [101, 707] [808, 202, 909, 303]
- [404, ] [606] [101, 707] [808, 202, 909, 303]
- [404, 505] [606] [101, 707] [808, 202, 909, 303]
- [404, 505] [606] [101, 707] [808, 202, 909, 303]
- [404, ] [101, 707] [808, 202, 909, 303]
- [404, 505] [101, 707] [808, 202, 909, 303]
- [404, 505, 606] [101, 707] [808, 202, 909, 303]
- [404, 505, 606] [101] [707] [808, 202, 909, 303]
- [404, 505, 606] [101] [808, 202, 909, 303]
- [404, 505, 606] [101, 707] [808, 202, 909, 303]
- [404, 505, 606] [101, 707] [808, 202, 909, 303]
- [101] [808, 202, 909, 303]
- [101, 404] [808, 202, 909, 303]
- [101, 404, 505] [808, 202, 909, 303]
- [101, 404, 505, 606] [808, 202, 909, 303]
- [101, 404, 505, 606, 707] [808, 202, 909, 303]
- [101, 404, 505, 606, 707] [808, 202, 909, 303]
- [101, 404, 505, 606, 707] [808, 202] [909, 303]
- [101, 404, 505, 606, 707] [808] [202] [909, 303]
- [101, 404, 505, 606, 707] [202] [909, 303]
- [101, 404, 505, 606, 707] [202,808] [909, 303]
- [101, 404, 505, 606, 707] [202,808] [909, 303]
- [101, 404, 505, 606, 707] [202,808] [909] [303]
- [101, 404, 505, 606, 707] [202,808] [303]
- [101, 404, 505, 606, 707] [202,808] [303, 909]
- [101, 404, 505, 606, 707] [202,808] [303, 909]
- [101, 404, 505, 606, 707] [202]
- [101, 404, 505, 606, 707] [202, 303]
- [101, 404, 505, 606, 707] [202, 303, 808]
- [101, 404, 505, 606, 707] [202, 303, 808, 909]
- [101, 404, 505, 606, 707] [202, 303, 808, 909]
- [101]
- [101, 202]
- [101, 202, 303]
- [101, 202, 303, 404]
- [101, 202, 303, 404, 505]
- [101, 202, 303, 404, 505, 606]
- [101, 202, 303, 404, 505, 606, 707]
- [101, 202, 303, 404, 505, 606, 707, 808]
- [101, 202, 303, 404, 505, 606, 707, 808, 909]
- Lista ordenada:
- [101, 202, 303, 404, 505, 606, 707, 808, 909]









Comments
Post a Comment