Quick Sort

@yd1ng· May 27, 2025 · 2 min read

퀵 정렬 (Quick Sort)

개요

퀵 정렬은 분할 정복(Divide & Conquer) 방식의 정렬 알고리즘입니다.
하나의 기준값(pivot)을 정하고, 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할한 뒤,
각 부분을 재귀적으로 정렬합니다.


코드 전체

#include <stdio.h>

void quick_sort(int arr[], int left, int right) {
    if (left >= right) return;
    // 종료 조건: 정렬할 구간에 원소가 1개 이하일 때

    int pivot = arr[left];  // 기준값(pivot): 맨 앞 원소
    int i = left + 1;       // 왼쪽에서 오른쪽으로 이동할 포인터
    int j = right;          // 오른쪽에서 왼쪽으로 이동할 포인터
    int temp;

    while (i <= j) {
        // pivot보다 큰 값을 만날 때까지 i를 오른쪽으로 이동
        while (i <= right && arr[i] <= pivot) i++;

        // pivot보다 작은 값을 만날 때까지 j를 왼쪽으로 이동
        while (j > left && arr[j] >= pivot) j--;

        if (i > j) {
            // i와 j가 엇갈리면 pivot과 arr[j]를 교환
            temp = arr[left];
            arr[left] = arr[j];
            arr[j] = temp;
        } else {
            // i와 j가 엇갈리지 않으면 두 값을 교환
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }

    // 왼쪽 파티션 정렬
    quick_sort(arr, left, j - 1);

    // 오른쪽 파티션 정렬
    quick_sort(arr, j + 1, right);
}

int main() {
    int arr[8] = {5, 3, 8, 4, 2, 7, 1, 6};

    quick_sort(arr, 0, 7);  // 전체 배열 정렬

    for (int i = 0; i < 8; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

핵심 요약

항목 설명
피벗 선택 보통 맨 앞 또는 랜덤
i, j 포인터 양쪽 끝에서 중앙으로 이동
교환 조건 i > j이면 pivot과 교환, 아니면 i와 j 교환
재귀 호출 왼쪽과 오른쪽 파티션을 각각 정렬

시간 복잡도

경우 시간 복잡도
최선 O(n log n)
평균 O(n log n)
최악 O(n²)
  • 공간 복잡도: O(log n) (재귀 스택)

특징 요약

  • 빠르고 실용적인 정렬 알고리즘
  • 제자리 정렬 (in-place)
  • 불안정 정렬 (같은 값의 순서가 바뀔 수 있음)
@yd1ng
안녕하세요. 양진영입니다.
© copyright 2025. yd1ng all rights reserved.