Application/기초

[기초] C++ 알고리즘 : 힙 정렬 (Heap Sort)

devsalix 2024. 5. 9. 06:44
728x90

 

힙 정렬(Heap Sort)은 힙(heap) 자료구조를 기반으로 한 정렬 알고리즘입니다.

이 알고리즘은 평균 및 최악의 경우에 모두 O(n log n)의 시간 복잡도를 가지며,

제자리 정렬(in-place sorting) 알고리즘 중 하나입니다.

힙 정렬은 주로 배열을 기반으로 작동하며, 추가적인 메모리 공간을 필요로 하지 않습니다.

 


 

일반적으로 다음과 같은 단계로 진행됩니다

 

  • 주어진 배열을 최대 힙(Max Heap) 또는 최소 힙(Min Heap)으로 구성합니다.

  • 최대 힙(또는 최소 힙)에서 가장 큰(또는 가장 작은) 요소를 추출하여 배열의 가장 뒤에 배치합니다.

  • 배열에서 추출한 요소를 제외하고 다시 최대 힙(또는 최소 힙)을 유지합니다.

  • 모든 요소가 정렬될 때까지 위 과정을 반복합니다.

#include <iostream>

// 힙 정렬 함수
void heapify(int arr[], int n, int i) {
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;

    // 왼쪽 자식이 루트보다 크면 largest 갱신
    if (left < n && arr[left] > arr[largest])
        largest = left;

    // 오른쪽 자식이 루트보다 크면 largest 갱신
    if (right < n && arr[right] > arr[largest])
        largest = right;

    // largest가 루트가 아니면 교환
    if (largest != i) {
        swap(arr[i], arr[largest]);

        // largest를 루트로 하는 서브트리를 다시 힙으로 만듬
        heapify(arr, n, largest);
    }
}

// 힙 정렬 함수
void heapSort(int arr[], int n) {
    // 최대 힙을 만듬
    for (int i = n / 2 - 1; i >= 0; i--)
        heapify(arr, n, i);

    // 한 번에 한 원소씩 힙에서 추출하여 정렬
    for (int i = n - 1; i >= 0; i--) {
        swap(arr[0], arr[i]); // 현재 루트(최대값)를 배열의 끝으로 이동
        heapify(arr, i, 0); // 배열의 크기를 줄여서 힙 속성 유지
    }
}

// 배열 출력 함수
void printArray(int arr[], int size) {
    for (int i = 0; i < size; ++i) {
        cout << arr[i] << " ";
	}
    cout << "\n";
}

int main() {
    int arr[] = {12, 11, 13, 5, 6, 7};
    int n = sizeof(arr) / sizeof(arr[0]);

    std::cout << "정렬 전 배열: ";
    printArray(arr, n);

    heapSort(arr, n);

    std::cout << "정렬 후 배열: ";
    printArray(arr, n);

    return 0;
}

 

 

출력 결과

 

정렬 전 배열: 12 11 13 5 6 7 
정렬 후 배열: 5 6 7 11 12 13

 

 

 


제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀

 

 
728x90
반응형