qsort con structs en C: ejercicio resuelto
qsort con structs en C: ejercicio resuelto
Si buscas qsort con structs en C ejercicio resuelto, aquí tienes la forma de pasar un comparador personalizado a qsort para ordenar un array de structs por distintos campos. qsort de <stdlib.h> acepta punteros a void en el comparador, por lo que hay que hacer un cast explícito al tipo concreto.
La firma del comparador debe ser int cmp(const void *a, const void *b) y devolver negativo, cero o positivo según el orden relativo de a y b.
Enunciado
Define una struct Alumno con campos nombre (array de 32 caracteres), nota (double) y edad (int). Crea un array de 5 alumnos y ordénalo de tres formas:
- Por nota descendente (mayor nota primero).
- Por nombre ascendente (orden alfabético).
- Por edad ascendente y, en caso de empate, por nota descendente.
Solución en C
Resultado esperado
Errores frecuentes
- Comparar doubles con
a->nota - b->notay devolver el resultado directamente: la diferencia puede ser un double muy pequeño que se trunca a 0 en el cast aint, dando empates incorrectos. Hay que usar comparaciones explícitas (>,<). - No usar
const Alumno *en el comparador: el cast desdeconst void *a un puntero no-const es válido pero genera advertencias del compilador; usarconstes lo correcto. - Olvidar el tercer argumento de
qsort(sizeof(Alumno)): si se pasasizeof(Alumno *)(tamaño de puntero),qsortinterpreta los datos de forma incorrecta. - No usar
strncmpcon el límiteMAX_Npara comparar cadenas en struct:strcmppuede leer más allá del campo si no está terminado en\0.
Aplicación práctica
qsort con comparadores personalizados es la herramienta estándar de C para ordenar cualquier array de registros: tablas de una base de datos en memoria, resultados de consultas, clasificaciones de usuarios, ordenación de archivos por nombre/tamaño/fecha y cualquier escenario donde el criterio de orden depende de múltiples campos.
Siguiente ejercicio recomendado
- Lista de structs en C: ejercicio resuelto
- Struct con punteros en C: ejercicio resuelto
- Inserción directa 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
¿qsort es estable? ¿Mantiene el orden de elementos iguales?
No está garantizado que sea estable. La implementación estándar en la mayoría de plataformas usa introsort (combinación de quicksort + heapsort), que no es estable. Si necesitas estabilidad, puedes añadir el índice original al comparador como criterio de desempate final.
¿Qué diferencia hay entre qsort y bsearch?
qsort ordena un array en su sitio; bsearch busca un elemento en un array ya ordenado, ambas en O(n log n) y O(log n) respectivamente. Se usan juntas: primero qsort, luego bsearch.
¿Se puede usar qsort con un array de punteros a struct?
Sí, y es frecuente cuando los elementos son grandes. El comparador recibe const void *a que es const Alumno **, por lo que el cast es *(const Alumno **)a. Ordenar punteros en lugar de structs completas evita copiar los datos durante la ordenación.