Bucket sort en C: ejercicio resuelto
Bucket sort en C: ejercicio resuelto
Si buscas bucket sort en C ejercicio resuelto, aquí tienes la implementación completa: distribuye los elementos en cubos (buckets), ordena cada cubo con inserción directa y los concatena, logrando O(n) esperado cuando los datos se distribuyen uniformemente en [0, 1).
Bucket sort es uno de los pocos algoritmos de ordenación que rompe la barrera Ω(n log n) de la ordenación por comparación, pero solo bajo el supuesto de distribución uniforme.
Enunciado
Ordena el array {0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68} usando bucket sort con 10 cubos. Muestra el contenido de los cubos antes de ordenarlos y el array final.
Solución en C
Resultado esperado
Errores frecuentes
- No liberar la memoria de los cubos: cada cubo es una lista enlazada que hay que liberar con
freepara evitar fugas de memoria. - No comprobar que
mallocdevuelveNULL: en sistemas con poca memoria la asignación puede fallar. - Calcular el índice del cubo con
(int)(val * NB)sin clampear: sival == 1.0el índice seríaNB, fuera del array. - Asumir que bucket sort es siempre O(n): en el peor caso (todos los elementos en el mismo cubo) degenera a O(n²) con inserción directa como algoritmo de cubo.
Aplicación práctica
Bucket sort se usa en sistemas de render (distribución de partículas por profundidad), en histogramas y en la fase de distribución de radix sort. Es especialmente eficiente cuando los datos vienen de una distribución uniforme, como números en coma flotante en [0, 1) generados aleatoriamente.
Siguiente ejercicio recomendado
- Counting sort en C: ejercicio resuelto
- Radix sort en C: ejercicio resuelto
- Heap sort en C: ejercicio resuelto
- Todos los ejercicios de C
Práctica guiada y libro completo
Si quieres una ruta completa con progresión real de dificultad:
FAQ
¿Por qué bucket sort puede ser O(n) si tiene un bucle interno de inserción?
Porque cuando los datos se distribuyen uniformemente, el número esperado de elementos por cubo es n/k (donde k es el número de cubos). Con k ≈ n cada cubo tiene en promedio 1 elemento, y la inserción directa en cada cubo es O(1). La suma de todos los cubos es O(n) en el caso promedio.
¿Cuántos cubos debo usar?
La regla general es usar tantos cubos como elementos (k = n), lo que da O(n) esperado. Con pocos cubos los tiempos de inserción dentro de cada cubo aumentan; con demasiados, el overhead de gestión de cubos vacíos domina.
¿Puedo usar bucket sort con enteros?
Sí, normalizando los valores al rango [0, 1) o usando directamente el valor como índice de cubo (equivalente a counting sort para rangos pequeños). Para enteros en un rango [min, max], el índice del cubo es (val - min) * NB / (max - min + 1).