C의 정렬 기능
이 기사에서는 C에서 표준 라이브러리 정렬 기능을 사용하는 방법에 대한 몇 가지 방법을 설명합니다.
qsort
함수를 사용하여 C에서 정수 배열 정렬
qsort
함수는 서로 다른 데이터 요소 배열에 대해 다소 일반적인 정렬 작업을 구현합니다. 즉,qsort
는 주어진 요소 배열에 대한 비교 함수를 전달하기 위해 네 번째 인수로 함수 포인터를 취합니다. 이 경우qsort
를 사용하여 정수 배열을 비교하는intCompare
함수를 구현했습니다. intCompare
는qsort
프로토 타입에 지정된대로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);
}
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