Menu
Coddy logo textTech

Selection Sort

Última actualización

El selection sort divide el arreglo en una región ordenada a la izquierda y una región no ordenada a la derecha. En cada pasada recorre la región no ordenada para encontrar el elemento más pequeño y luego lo intercambia a la primera posición no ordenada, aumentando la región ordenada en uno. Pulsa reproducir arriba para ver el recorrido e intercambio, o avanza comparación por comparación.

El selection sort siempre realiza el mismo número de comparaciones sin importar la entrada, pero hace como máximo n-1 intercambios - muchos menos que el bubble sort - lo que importa cuando las escrituras son costosas.

Complejidad temporal y espacial

CasoComplejidadNotas
Mejor casoO(n²)Las comparaciones ocurren incluso si está ordenado
Caso promedioO(n²)Orden aleatorio
Peor casoO(n²)Orden inverso
EspacioO(1)En el lugar
EstableNoLos intercambios pueden reordenar elementos iguales

Paso a paso

PasoQué ocurre
1Considera todo el arreglo como no ordenado.
2Recorre la región no ordenada para encontrar el elemento mínimo.
3Intercambia ese mínimo a la primera posición no ordenada.
4Mueve el límite un paso a la derecha (esa posición ya está ordenada).
5Repite hasta que solo quede un elemento no ordenado.

Ejemplo resuelto

Ordenando [5, 2, 4, 1]:

PasadaArregloAcción
Inicio[5, 2, 4, 1]Todo el arreglo está no ordenado.
1[1, 2, 4, 5]Recorre [5, 2, 4, 1], el mínimo es 1 en el índice 3; se intercambia con el índice 0.
2[1, 2, 4, 5]Recorre [2, 4, 5], el mínimo es 2 que ya está en el índice 1; se intercambia consigo mismo.
3[1, 2, 4, 5]Recorre [4, 5], el mínimo es 4 que ya está en el índice 2; no hace falta mover nada.
Fin[1, 2, 4, 5]Solo queda 5, así que ya está en su lugar.

Cuándo usar selection sort

Úsalo cuandoEvítalo cuando
Las escrituras son costosas: hace como máximo n-1 intercambios.El arreglo es grande: dominan las O(n²) comparaciones.
Necesitas un ordenamiento en el lugar simple y fácil de implementar.Necesitas un ordenamiento estable que conserve el orden de las claves iguales.
La memoria es limitada: usa solo O(1) de espacio extra.Los datos están casi ordenados: no puede terminar antes como el insertion sort.
El conjunto de datos es diminuto y el rendimiento predecible importa.Importa el rendimiento: los ordenamientos O(n log n) como quicksort son mucho más rápidos.

Código de Selection Sort

Una implementación limpia y ejecutable de Selection Sort en Python, JavaScript, Java, C++, C. Elige un lenguaje, copia el código o ábrelo ya cargado en el Playground de Coddy.

Código de Selection Sort en Python

Python
1def selection_sort(a):2    n = len(a)3    for i in range(n - 1):4        # Find the smallest element in the unsorted tail5        min_idx = i6        for j in range(i + 1, n):7            if a[j] < a[min_idx]:8                min_idx = j9        a[i], a[min_idx] = a[min_idx], a[i]10    return a11
12
13nums = [64, 25, 12, 22, 11]14print("Before:", nums)15selection_sort(nums)16print("After: ", nums)
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre Selection Sort

¿Cuál es la complejidad temporal del selection sort?
El selection sort es O(n²) en todos los casos - mejor, promedio y peor - porque siempre recorre toda la región no ordenada para encontrar cada mínimo. Usa O(1) de espacio extra.
¿Es estable el selection sort?
La versión estándar en el lugar no es estable, porque intercambiar un mínimo lejano a su posición puede mover un elemento igual por delante de otro. Existe una variante estable, pero requiere desplazar en lugar de intercambiar.
¿Cuándo es útil el selection sort?
Es útil cuando el costo de escribir en memoria es alto, ya que realiza como máximo n-1 intercambios - el mínimo posible para un ordenamiento por comparación que mueve elementos.
¿Cuál es la diferencia entre selection sort y bubble sort?
Ambos son ordenamientos por comparación O(n²), pero el selection sort hace como máximo n-1 intercambios mientras que el bubble sort puede hacer hasta O(n²) intercambios. El bubble sort también puede detectar un arreglo ya ordenado y detenerse antes, mientras que el selection sort siempre ejecuta todas las pasadas.
¿Debería usar selection sort o insertion sort?
En la mayoría de los casos prefiere el insertion sort: es estable, corre en O(n) con datos casi ordenados y es más rápido en promedio. Elige el selection sort solo cuando minimizar el número de escrituras sea la prioridad, ya que garantiza como máximo n-1 intercambios.
¿Por qué el selection sort siempre corre en O(n²) incluso en un arreglo ordenado?
El selection sort no tiene forma de saber que un elemento ya es el mínimo sin recorrer el resto de la región no ordenada, así que realiza todas las comparaciones en cada pasada sin importar el orden de entrada. Por eso el mejor caso iguala al peor en O(n²) - a diferencia del insertion o bubble sort, que pueden cortocircuitar.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR