Función de ordenación en C
-
Utilizar la función
qsort
para ordenar un array de enteros en C -
Utilizar la función
qsort
para ordenar un array de cadenas en C
Este artículo explicará varios métodos de cómo utilizar la función de ordenación de la biblioteca estándar en C.
Utilizar la función qsort
para ordenar un array de enteros en C
La función qsort
implementa una operación de ordenación algo genérica para diferentes matrices de elementos de datos. En concreto, qsort
toma el puntero a la función como cuarto argumento para pasar la función de comparación para un array de elementos dado. En este caso, implementamos la función intCompare
para comparar arrays de enteros utilizando qsort
. Ten en cuenta que intCompare
debe tener el tipo - int (*compar)(const void *, const void *)
tal y como especifica el prototipo qsort
. Por lo tanto, primero estamos convirtiendo los argumentos p1
/p2
en punteros int
y luego los desreferenciamos para acceder a los valores. El valor de retorno de la función de comparación debe ser un entero menor que 0 si el primer parámetro es menor que el otro, mayor que 0 si el primer parámetro es mayor que el segundo, y cero si los dos parámetros son iguales.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int intCompare(const void *p1, const void *p2) {
int int_a = *((int *)p1);
int int_b = *((int *)p2);
if (int_a == int_b)
return 0;
else if (int_a < int_b)
return -1;
else
return 1;
}
void printIntegers(int arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%4d | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
int arr2[] = {53, 32, 12, 52, 87, 43, 93, 23};
printIntegers(arr2, 8);
qsort(arr2, 8, sizeof(int), intCompare);
printIntegers(arr2, 8);
exit(EXIT_SUCCESS);
}
Producción :
53 | 32 | 12 | 52 | 87 | 43 | 93 | 23 |
12 | 23 | 32 | 43 | 52 | 53 | 87 | 93 |
Utilizar la función qsort
para ordenar un array de cadenas en C
qsort
puede ordenar el array de cadenas en orden ascendente con strcmp
actuando como función de comparación. En este caso, declaramos e inicializamos el array de punteros char
, cuyos elementos se ordenan con una sola llamada a la función qsort
. Fíjate en que el casting y la desreferenciación es la parte necesaria de la función de comparación, ya que toma ambos parámetros como tipos de punteros void
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int stringCompare(const void *p1, const void *p2) {
return strcmp(*(char *const *)p1, *(char *const *)p2);
}
void printStrings(char *arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%10s | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
char *arr[] = {"jello", "hello", "mello", "zello", "aello"};
printStrings(arr, 5);
qsort(arr, 5, sizeof(char *), stringCompare);
printStrings(arr, 5);
exit(EXIT_SUCCESS);
}
Producción :
jello | hello | mello | zello | aello |
aello | hello | jello | mello | zello |
Alternativamente, se puede reimplementar el código del ejemplo anterior para que el usuario proporcione el array de cadenas con los argumentos del programa y el array ordenado se imprima como salida. Esta vez, es esencial comprobar si hay suficientes argumentos pasados para ordenar antes de proceder a llamar a qsort
. Fíjate en que la función stringCompare
devuelve directamente el valor de la llamada strcmp
ya que esta última tiene la misma especificación de valores de retorno que la función de comparación para el qsort
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int stringCompare(const void *p1, const void *p2) {
return strcmp(*(char *const *)p1, *(char *const *)p2);
}
void printStrings(char *arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%10s | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("Usage: ./program string_0 string_1 string_2...\n");
exit(EXIT_FAILURE);
}
printStrings(argv + 1, argc - 1);
qsort(argv + 1, argc - 1, sizeof(char *), stringCompare);
printStrings(argv + 1, argc - 1);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook