반응형
C++에서는 #include <algorithm> 하면 sort를 매우매우 쉽게 쓸수 있지만... C는 그렇게 호락호락하지 않다.
그래도 우리에게는 stdlib이 있다!
#include <stdlib.h>
- qsort()
※주의
비교 함수를 정의할 때!!! 반드시 const void*형의 파라미터로 작성해줘야함.
qsort는 비교 함수(comparator) 를 사용하여 요소를 정렬함.
비교 함수는 두 개의 포인터를 받아, 다음과 같은 값을 반환해야 함.
비교 결과 | 반환 값 |
a < b | 음수 (-1) |
a == b | 0 |
a > b | 양수 (1) |
아래도 같은거다!
비교 결과 | 반환값 (예시) | 의미 |
a < b | 음수 (-1, -10, -100 등) | a가 b보다 앞에 와야 함 |
a == b | 0 | 순서 유지 (변경 없음) |
a > b | 양수 (1, 10, 100 등) | a가 b보다 뒤에 와야 함 |
즉, 음수이면 앞에 배치, 양수이면 뒤에 배치하는 방식입니다.
내가 이해한 방법 : 파라미터의 순서대로 앞에서부터 a,b 일때! (아래 코드 기준이란 소리)
내가 하고 싶은 행동 | return 값 |
a를 b보다 앞에 두고 싶다. (위치를 그냥 둘래) | 음수 (-1, -10, -100 등) |
a랑 b가 같다. | 0 |
b를 a보다 앞에 두고 싶다. (위치를 바꿔줘) | 양수 (1, 10, 100 등) |
오름차순 정렬
> 기본 문법
#include <stdio.h>
#include <stdlib.h> // qsort 함수 포함
// 비교 함수
/*
1이면, a가 b보다 앞에 와야 함
0이면, 순서 유지(변경 없음)
-1이면, a가 b보다 뒤에 와야 함
0과 -1이 무슨차이인지 모르겠지만, 아무튼 다르다고 함. 구분해줘야한다고함
-> -1을 반환하면 보통 a가 b보다 앞에 정렬되지만, 항상 완벽한 정렬을 보장하지 않음.
qsort 특성에서 특이점이 오는것 같기도...? 아시는분 댓글 부탁드립니다.
*/
int compare(const void *a, const void *b) {
int num1 = *(int*)a;
int num2 = *(int*)b;
if (num1 < num2) return -1; // num1이 앞
if (num1 > num2) return 1; // num2가 앞
return 0; // 같으면 변경 없음
}
int main() {
int arr[] = {5, 2, 9, 1, 5, 6};
int size = sizeof(arr) / sizeof(arr[0]);
qsort(arr, size, sizeof(int), compare);
printf("정렬된 배열: ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
> 구조체일 때, 정렬해보기
#include <stdio.h>
#include <stdlib.h>
// 구조체 정의
typedef struct {
char name[20];
int age;
} Person;
// 비교 함수: 나이(age) 오름차순 정렬
int compare_by_age(const void *a, const void *b) {
// 강제 형변환
const Person *p1 = (const Person*)a;
const Person *p2 = (const Person*)b;
return p1->age - p2->age;
}
int main() {
Person people[] = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};
int size = sizeof(people) / sizeof(people[0]);
qsort((void*)people, size, sizeof(Person), compare_by_age);
printf("나이 순 정렬 결과:\n");
for (int i = 0; i < size; i++) {
printf("이름: %s, 나이: %d\n", people[i].name, people[i].age);
}
return 0;
}
반응형
'SW개발 > 갑자기 C코테를 봐야할때' 카테고리의 다른 글
1. 입출력( scanf, printf, gets, fgets ) (0) | 2025.02.04 |
---|