2. 정렬( qsort() )

2025. 2. 4. 21:53·SW개발/갑자기 C코테를 봐야할때
반응형

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
'SW개발/갑자기 C코테를 봐야할때' 카테고리의 다른 글
  • 1. 입출력( scanf, printf, gets, fgets )
코코도롱
코코도롱
    반응형
  • 코코도롱
    도롱이의 전자공학소
    코코도롱
  • 전체
    오늘
    어제
    • 분류 전체보기 (61) N
      • AI (17) N
        • 데이터 분석과 모델 학습 (4)
        • 모델별 정리 (8) N
        • (PJT)음성 화자 분류 (4)
      • SW개발 (38)
        • C++ (9)
        • 면접을 위한 CS 전공지식 노트 (24)
        • Django+Vue.js (0)
        • 이런저런 개발이야기 (1)
        • 갑자기 C코테를 봐야할때 (2)
        • RPI5 프로젝트 (1)
        • 트러블슈팅 (1)
      • ESG (2)
        • 내가 쓰는 Assay (1)
        • 뉴스 스크랩 (1)
      • 반도체 (4)
        • 반도체 (3)
        • 슬기로운 학부생활 (1)
        • 회로 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    정리본
    MySQL
    메시지큐
    데이터분석 #머신러닝 #딥러닝 #데이터사이언스 #알고리즘 #데이터전처리
    데이터분석 #데이터전처리 #결측치 #머신러닝 #딥러닝 #Pandas #DataFrame
    홉바이홉통신
    파일입출력 #DataFrame불러오기
    면접을 위한 CS 전공지식 노트
    c io
    반도체 공학
    반도체 물성
    LAN
    CS지식
    페이징 기법
    c언어 입출력
    보고서 수식
    전공 지식
    요약본
    공백포함입력받기
    word 수식
    홉바이홉
    os구조
    멀티프로세스
    운영체제
    ESG
    반도체 소자 공학
    면접을 위한 cs전공지식 노트
    입출력관리
    데이터전처리 #데이터분석 #딥러닝 #머신러닝 #Pandas #Numpy #Python
    ios7계층
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코코도롱
2. 정렬( qsort() )
상단으로

티스토리툴바