C/C++ 알고리즘

퀵 정렬

Pivot을 최종 위치에 놓고 두 partition을 재귀 정렬합니다.

퀵 정렬이란?

Pivot을 최종 위치에 놓고 두 partition을 재귀 정렬합니다.

Pivot 주변으로 값을 partition합니다.

중요한 점

  • 빈 입력, 한 요소, 중복, 정렬된 입력을 테스트하세요.
  • 정확성과 최적화를 분리하세요.
  • 프로덕션에서는 standard library를 우선하세요.

퀵 정렬 시각화

O(n log n)

재생 또는 한 단계를 눌러 비교와 데이터 이동 과정을 확인하세요.

C와 C++ 코드 예제

C
실행 →
main.c
#include <stdio.h>

void swap(int *left, int *right) {
    int temporary = *left;
    *left = *right;
    *right = temporary;
}

int partition(int *values, int low, int high) {
    int pivot = values[high];
    int boundary = low;
    for (int scan = low; scan < high; ++scan) {
        if (values[scan] < pivot) {
            swap(&values[boundary++], &values[scan]);
        }
    }
    swap(&values[boundary], &values[high]);
    return boundary;
}

void quick_sort(int *values, int low, int high) {
    if (low >= high) return;
    int pivot = partition(values, low, high);
    quick_sort(values, low, pivot - 1);
    quick_sort(values, pivot + 1, high);
}

int main(void) {
    int values[] = {9, 4, 7, 3, 10, 5};
    quick_sort(values, 0, 5);
    for (int index = 0; index < 6; ++index) {
        printf("%d ", values[index]);
    }
}
예상 출력
3 4 5 7 9 10
C++
실행 →
main.cpp
#include <algorithm>
#include <iostream>
#include <vector>

template<class Iterator>
void quick_sort(Iterator first, Iterator last) {
    if (last - first < 2) return;
    auto pivot = *(last - 1);
    auto middle = std::partition(first, last - 1,
        [pivot](int value) { return value < pivot; });
    std::iter_swap(middle, last - 1);
    quick_sort(first, middle);
    quick_sort(middle + 1, last);
}

int main() {
    std::vector values{9, 4, 7, 3, 10, 5};
    quick_sort(values.begin(), values.end());
    for (int value : values) {
        std::cout << value << ' ';
    }
}
예상 출력
3 4 5 7 9 10

C와 C++ 비교

평균 O(n log n), 나쁜 pivot은 O(n²). C++는 std::partition으로 단계를 표현합니다.

C

Loop, pointer, length와 buffer가 명시적입니다.

C++

Iterator와 algorithm이 연산과 저장 방식을 분리합니다.

연습 문제

두 버전을 실행하고 수정하여 각 언어의 보장을 관찰하세요.

  • 각 비교를 직접 추적하세요.
  • 중복과 극값을 테스트하세요.
  • Standard library와 benchmark하세요.