Função de classificação em C
-
Use a função
qsort
para classificar un array de inteiros em C -
Use a função
qsort
para classificar un array de strings em C
Este artigo irá explicar vários métodos de como usar a função de classificação de biblioteca padrão em C.
Use a função qsort
para classificar un array de inteiros em C
A função qsort
implementa uma operação de classificação um tanto genérica para diferentes arrays de elementos de dados. A saber, qsort
leva o ponteiro para funcionar como o quarto argumento para passar a função de comparação para um determinado array de elementos. Nesse caso, implementamos a função intCompare
para comparar a matriz de inteiros usando qsort
. Observe que intCompare
deve ter o tipo - int (*compar)(const void *, const void *)
conforme especificado pelo protótipo qsort
. Consequentemente, estamos lançando os argumentos p1
/ p2
para ponteiros int
primeiro e, em seguida, desreferenciando-os para acessar os próprios valores. O valor de retorno da função de comparação deve ser o inteiro menor que 0 se o primeiro parâmetro for menor que o outro, maior que 0 se o primeiro parâmetro for maior que o segundo e zero se dois parâmetros forem iguais.
#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);
}
Resultado:
53 | 32 | 12 | 52 | 87 | 43 | 93 | 23 |
12 | 23 | 32 | 43 | 52 | 53 | 87 | 93 |
Use a função qsort
para classificar un array de strings em C
qsort
pode classificar a matriz de strings em ordem crescente com strcmp
atuando como a função de comparação. Nesse caso, declaramos e inicializamos o array de ponteiros char
, elementos dos quais são classificados com uma única chamada para a função qsort
. Observe que a conversão e desreferenciamento é a parte necessária da função de comparação, pois leva os dois parâmetros como tipos de ponteiro 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);
}
Resultado:
jello | hello | mello | zello | aello |
aello | hello | jello | mello | zello |
Como alternativa, pode-se reimplementar o código de exemplo anterior para que o usuário forneça ao array string os argumentos do programa e o array ordenado seja impresso como uma saída. Desta vez, é essencial verificar se há argumentos suficientes passados para classificar antes de prosseguir para chamar qsort
. Observe que a função stringCompare
retorna diretamente o valor da chamada strcmp
, já que a última tem a mesma especificação de valores de retorno que a função de comparação para 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