본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

정렬 문서
정렬
정렬의 개념동작 원리구현복잡도연습 문제실무 활용
토론

정렬 안내서 · 4/6

복잡도

정렬 알고리즘은 시간 복잡도만으로 고르지 않습니다. 최선 · 평균 · 최악의 차이, 추가 메모리, 안정성, 입력 패턴에 대한 민감도를 함께 봐야 합니다. 이 장에서는 주요 정렬의 복잡도를 정리하고, 비교 정렬의 하한이 왜 n log n인지, 그리고 계수 · 기수 정렬이 그 하한을 어떻게 피하는지 살펴봅니다.

한눈에 보는 비교표

알고리즘최선평균최악추가 메모리안정제자리
버블 정렬(조기 종료)O(n)O(n²)O(n²)O(1)예예
선택 정렬O(n²)O(n²)O(n²)O(1)아니오예
삽입 정렬O(n)O(n²)O(n²)O(1)예예
병합 정렬O(n log n)O(n log n)O(n log n)O(n)예아니오
퀵 정렬(무작위 기준값)O(n log n)O(n log n)O(n²)O(log n) 스택아니오예
힙 정렬O(n log n)O(n log n)O(n log n)O(1)아니오예
TimsortO(n)O(n log n)O(n log n)O(n)예아니오
인트로소트O(n log n)O(n log n)O(n log n)O(log n)아니오예
계수 정렬O(n + k)O(n + k)O(n + k)O(n + k)예아니오
기수 정렬O(d(n + b))O(d(n + b))O(d(n + b))O(n + b)예아니오

k는 값의 범위, d는 자릿수, b는 한 자릿수가 가질 수 있는 값의 개수(기수)입니다. 퀵 정렬의 스택 O(log n)은 작은 쪽만 재귀하는 구현에서 성립하며, 단순하게 양쪽을 모두 재귀하면 최악에 O(n)까지 깊어집니다.

병합 정렬과 퀵 정렬의 분석

병합 정렬의 시간은 점화식 T(n) = 2T(n/2) + O(n)으로 표현됩니다. 크기 n을 반씩 나누면 깊이가 log n이고, 각 깊이에서 합치는 일의 총량이 n이므로 O(n log n)입니다. 입력이 어떻든 똑같이 나누므로 최선과 최악이 같습니다.

퀵 정렬은 기준값이 배열을 얼마나 고르게 나누느냐에 달려 있습니다. 매번 반으로 나누면 병합 정렬과 같은 O(n log n)이고, 매번 한쪽이 비면 n + (n - 1) + ... + 1 = O(n²)입니다. 무작위 기준값을 쓰면 기대 비교 횟수가 약 1.39 n log₂ n으로, 병합 정렬보다 비교는 조금 많지만 제자리에서 연속된 메모리를 훑기 때문에 실제로는 대개 더 빠릅니다. 정렬된 입력에 "첫 원소를 기준값으로" 쓰는 순진한 구현이 얼마나 나빠지는지 직접 세어 볼 수 있습니다.

import random

def quicksort_count(a, choose):
    comparisons = 0
    stack = [(0, len(a) - 1)]
    while stack:
        lo, hi = stack.pop()
        if lo >= hi:
            continue
        p = choose(lo, hi)
        a[p], a[hi] = a[hi], a[p]
        pivot, i = a[hi], lo
        for j in range(lo, hi):
            comparisons += 1
            if a[j] < pivot:
                a[i], a[j] = a[j], a[i]
                i += 1
        a[i], a[hi] = a[hi], a[i]
        stack += [(lo, i - 1), (i + 1, hi)]
    return comparisons

n = 2000
print(quicksort_count(list(range(n)), lambda lo, hi: lo))               # 1999000 = n(n-1)/2
print(quicksort_count(list(range(n)), lambda lo, hi: random.randint(lo, hi)))  # 대략 25000 안팎

비교 정렬의 하한 Ω(n log n)

비교 정렬은 "a < b인가?"라는 예/아니오 질문만으로 순서를 알아내야 합니다. 가능한 모든 질문의 흐름을 트리로 그리면(결정 트리), 각 잎은 입력의 한 가지 순열에 대응합니다. 서로 다른 n개의 원소를 늘어놓는 방법은 n!가지이므로 잎이 적어도 n!개 필요하고, 높이가 h인 이진 트리의 잎은 최대 2^h개입니다. 따라서 2^h ≥ n!, 즉 h ≥ log₂(n!)입니다. n!은 적어도 (n/2)^(n/2)이므로 log₂(n!) ≥ (n/2) log₂(n/2)가 되어, 최악의 비교 횟수는 Ω(n log n)입니다.

이 결과는 병합 정렬과 힙 정렬이 점근적으로 최적이라는 뜻입니다. 동시에 "비교만 쓴다"는 전제를 버리면 더 빨라질 수 있다는 뜻이기도 합니다.

import math

for n in [10, 100, 1000]:
    lower = math.ceil(math.log2(math.factorial(n)))
    print(n, lower, round(n * math.log2(n)))
# 10 22 33
# 100 525 664
# 1000 8530 9966

비교하지 않는 정렬

계수 정렬은 값의 범위 k가 n과 비슷하거나 작을 때 O(n + k)에 정렬합니다. 나이, 점수(0~100), 바이트 값처럼 범위가 좁은 정수에 적합하지만, k가 크면 메모리와 시간이 k에 끌려갑니다.

기수 정렬은 w비트 정수를 r비트씩 나누어 d = w / r번 안정적인 계수 정렬을 합니다. 32비트 정수를 8비트씩 나누면 d = 4, b = 256이므로 4(n + 256), 사실상 선형입니다. 문자열도 고정 길이라면 같은 방식으로 정렬할 수 있습니다.

def radix_sort(a, bits=32, r=8):
    mask = (1 << r) - 1
    for shift in range(0, bits, r):
        buckets = [[] for _ in range(1 << r)]
        for x in a:                      # 앞에서부터 넣으므로 안정적
            buckets[(x >> shift) & mask].append(x)
        a = [x for bucket in buckets for x in bucket]
    return a

print(radix_sort([170, 45, 75, 90, 802, 24, 2, 66]))
# [2, 24, 45, 66, 75, 90, 170, 802]

이 구현은 음이 아닌 정수만 다룹니다. 음수는 부호 비트를 뒤집거나 따로 나누어 처리해야 합니다.

정리

  • 병합 · 힙 정렬은 최악에도 O(n log n)이고, 퀵 정렬은 평균이 빠르지만 최악 O(n²)을 기준값 선택으로 막아야 합니다.
  • 비교 정렬은 결정 트리 논증으로 Ω(n log n)보다 빠를 수 없습니다.
  • 계수 · 기수 정렬은 정수라는 성질을 이용해 선형 시간에 가깝게 정렬하지만 범위와 메모리라는 대가가 있습니다.
  • 실제 선택에서는 안정성, 추가 메모리, 거의 정렬된 입력에 대한 적응성도 함께 따집니다.
이 장에 대해 질문이 있나요?
이전 장구현다음 장연습 문제

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.