C의 정렬 기능

Jinku Hu 2023년10월12일
  1. qsort 함수를 사용하여 C에서 정수 배열 정렬
  2. qsort 함수를 사용하여 C에서 문자열 배열 정렬
C의 정렬 기능

이 기사에서는 C에서 표준 라이브러리 정렬 기능을 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

qsort 함수를 사용하여 C에서 정수 배열 정렬

qsort 함수는 서로 다른 데이터 요소 배열에 대해 다소 일반적인 정렬 작업을 구현합니다. 즉,qsort는 주어진 요소 배열에 대한 비교 함수를 전달하기 위해 네 번째 인수로 함수 포인터를 취합니다. 이 경우qsort를 사용하여 정수 배열을 비교하는intCompare 함수를 구현했습니다. intCompareqsort 프로토 타입에 지정된대로int (*compar)(const void *, const void *)유형을 가져야합니다. 결과적으로 우리는 먼저p1/p2 인수를int 포인터로 캐스팅 한 다음 값 자체에 액세스하기 위해 역 참조합니다. 비교 함수의 반환 값은 첫 번째 매개 변수가 다른 매개 변수보다 작 으면 0보다 작은 정수, 첫 번째 매개 변수가 두 번째 매개 변수보다 크면 0보다 크고, 두 매개 변수가 같으면 0이어야합니다.

#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);
}

출력:

53 |   32 |   12 |   52 |   87 |   43 |   93 |   23 |
12 |   23 |   32 |   43 |   52 |   53 |   87 |   93 |

qsort 함수를 사용하여 C에서 문자열 배열 정렬

qsort는 비교 함수 역할을하는strcmp를 사용하여 문자열 배열을 오름차순으로 정렬 할 수 있습니다. 이 경우 우리는qsort 함수에 대한 단일 호출로 정렬되는char 포인터 배열을 선언하고 초기화했습니다. 캐스팅과 역 참조는 두 매개 변수를 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);
}

출력:

jello |      hello |      mello |      zello |      aello |
aello |      hello |      jello |      mello |      zello |

또는 사용자가 문자열 배열에 프로그램 인수를 제공하고 정렬 된 배열이 출력으로 인쇄되도록 이전 예제 코드를 다시 구현할 수 있습니다. 이번에는qsort를 호출하기 전에 정렬 할 인수가 충분한 지 확인하는 것이 중요합니다. stringCompare 함수는strcmp 호출의 값을 직접 반환합니다. 후자는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);
}
작가: 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