Função de classificação em C
- 
          
            Use a função qsortpara classificar un array de inteiros em C
- 
          
            Use a função qsortpara 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