본문 바로가기
프로그래밍/C

C언어 ] qsort (Quick Sort, 퀵정렬) 함수 사용법

by eteo 2024. 1. 30.

 

 

C언어 표준 라이브러리에 포함된 qsort 함수는 퀵 정렬(Quick Sort) 알고리즘을 사용하여 배열을 정렬하는 데에 사용된다. 아래는 qsort 함수의 사용법에 대한 예시이다.

 

 

1. 헤더 파일 include

qsort 함수를 사용하려면 stdlib.h 헤더 파일을 포함해야 한다.

#include <stdlib.h>

 

 

 

 

2. 비교 함수 작성

qsort 함수를 사용하기 위해선 정렬을 위해 사용할 비교 함수를 만들어야 하며, 이 함수는 두 요소를 받아들여 비교한 결과를 반환해야 한다. 반환값이 음수, 0, 양수인지에 따라 정렬의 순서가 결정된다.

 

  • 비교 함수의 반환값이 양수면, qsort 함수는 두 요소의 순서를 바꾼다.
int compare(const void *a, const void *b) {
    // 비교 로직 작성
    return (*(int*)a - *(int*)b);
}

 

위의 예시는 정수 배열을 오름차순으로 정렬하는 경우이며, 만약 내림차순으로 정렬하고 싶다면 아래와 같이 비교로직을 변경하면 된다.

return (*(int*)b - *(int*)a);

 

 

 

 

3. qsort 호출

 

int main() {
    int arr[] = {5, 2, 9, 1, 5, 6};
    int n = sizeof(arr) / sizeof(arr[0]);

    // qsort 함수 호출
    qsort(arr, n, sizeof(int), compare);

    // 정렬된 배열 출력
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

 

 

qsort 함수의 인자는 다음과 같습니다.

void qsort (void* base, size_t n, size_t size, int (*compare)(const void*,const void*));

 

  • base : 정렬할 배열의 시작 주소
  • n : 배열의 요소 개수
  • size : 각 요소의 크기 (바이트 단위)
  • compare : 비교 함수

 

 

- 문자열 배열 정렬 예시

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 문자열 비교 함수
int compareString(const void *a, const void *b) {
    return strcmp(*(const char**)a, *(const char**)b);
}

int main() {
    const char *strArr[] = {"apple", "orange", "banana", "grape", "kiwi"};
    int n = sizeof(strArr) / sizeof(strArr[0]);

    qsort(strArr, n, sizeof(const char*), compareString);

    printf("문자열 배열 정렬 결과: ");
    for (int i = 0; i < n; i++) {
        printf("%s ", strArr[i]);
    }

    return 0;
}

 

 

 

 

- 구조체 배열 정렬 예시

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 구조체 정의
struct Person {
    char name[50];
    int age;
};

// 구조체 비교 함수
int compareStruct(const void *a, const void *b) {
    return ((struct Person*)a)->age - ((struct Person*)b)->age;
}

int main() {
    struct Person people[] = {{"Alice", 25}, {"Bob", 20}, {"Charlie", 30}, {"David", 22}};
    int n = sizeof(people) / sizeof(people[0]);

    qsort(people, n, sizeof(struct Person), compareStruct);

    printf("구조체 배열 정렬 결과: \n");
    for (int i = 0; i < n; i++) {
        printf("%s (%d years old)\n", people[i].name, people[i].age);
    }

    return 0;
}