Função de classificação em C

Jinku Hu 12 outubro 2023
  1. Use a função qsort para classificar un array de inteiros em C
  2. Use a função qsort para classificar un array de strings em C
Função de classificação 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);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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