(CS/컴퓨터공학) 정렬 알고리즘 핵심만 보기 — 퀵/머지/힙 정렬 복잡도 비교

✨ 개요

정렬 알고리즘 핵심만 보기 — 퀵/머지/힙 정렬 시간·공간 복잡도 비교

상위 3종 정렬 퀵(Quick) · 머지(Merge) · 힙(Heap) 을 필드에서 자주 묻는 포인트만 압축 정리합니다.


1. 한 장 요약

알고리즘 평균 시간 최악 시간 최선 시간 공간 복잡도 안정성 제자리(In-place)
퀵정렬 O(n log n) O(n^2) O(n log n) O(log n) (재귀 스택) ✅(파티션 in-place)
머지정렬 O(n log n) O(n log n) O(n log n) O(n) (배열), O(1) (연결리스트) ❌(배열) / ✅(연결리스트)
힙정렬 O(n log n) O(n log n) O(n log n) O(1)

안정성(Stable): 같은 키의 상대 순서가 보존되는가?
제자리(In-place): 추가 배열 없이(상수 공간) 내부에서 정렬하는가?


2 핵심 특징과 언제 쓰나

🔸 퀵정렬 (Quick Sort)

🔸 머지정렬 (Merge Sort)

🔸 힙정렬 (Heap Sort)


3 미니 의사코드 (Kotlin 유사)

fun mergeSort(a: IntArray) {
    val buf = IntArray(a.size)
    fun sort(l: Int, r: Int) {
        if (l >= r) return
        val m = (l + r) ushr 1
        sort(l, m); sort(m + 1, r)
        // merge
        var i = l; var j = m + 1; var k = l
        while (i <= m && j <= r) buf[k++] = if (a[i] <= a[j]) a[i++] else a[j++]
        while (i <= m) buf[k++] = a[i++]
        while (j <= r) buf[k++] = a[j++]
        for (t in l..r) a[t] = buf[t]
    }
    sort(0, a.lastIndex)
}

fun heapSort(a: IntArray) {
    fun down(i: Int, n: Int) {
        var p = i
        while (true) {
            val l = p * 2 + 1; val r = l + 1
            var largest = p
            if (l < n && a[l] > a[largest]) largest = l
            if (r < n && a[r] > a[largest]) largest = r
            if (largest == p) break
            a[p] = a[largest].also { a[largest] = a[p] }; p = largest
        }
    }
    // build max-heap
    for (i in a.size / 2 - 1 downTo 0) down(i, a.size)
    // extract
    for (end in a.lastIndex downTo 1) {
        a[0] = a[end].also { a[end] = a[0] }
        down(0, end)
    }
}

4. 택 가이드 (실무 감각)


5. 추가 팁


6. 결론



Related Posts