1 분 소요

Description

힙 정렬은 완전 이진트리 구조로 최대 힙 또는 최소 힙을 만들어 정렬을 이루어 간다
시간 복잡도 = O(N*logN) 이다.

HeapTree

int dataArr[] = { 6, 5, 3, 2, 1, 0, 7 }
에 대해 최대 힙을 만들어 정렬 하는 방식을 알아보자.
최대 힙은 부모가 자식보다 크도록 만들어 나가면 된다.

Desc1
0번 index는 부모가 없으므로 1번 index부터 부모와 자기 자신의 크기를 비교한다.
1번 index 5와 그 부모인 0번 index 6의 크기를 비교한다.
부모가 자식보다 큰 최대 힙 조건에 적합 하므로 다음으로 넘어간다.

Desc2
2번 index 3과 그 부모인 0번 index 6과 비교한다.
조건에 맞으므로 다음 으로 넘어간다.

Desc3
3번 index 2와 부모인 1번 index 5와 비교한다.

Desc4
4번 index 1과 부모인 1번 index 5와 비교한다.

Desc5
5번 index 0과 부모인 2번 index 3와 비교한다.

Desc6
6번 index 7과 부모인 2번 index 3와 비교한다.
자식인 7이 부모 3보다 크므로 서로 자리를 바꾼다.

Desc7
교환이 이루어졌으므로 2번 index 7과 그 부모인 0번 index 6을 비교한다.
자식인 7이 부모 6보다 크므로 서로 자리를 바꾼다.

Desc8
가장 큰수인 7이 최상위 부모가 되었고 모든 부모가 모든 자식보다 큰 최대 힙구조로 이루어졌다.
이제 최상위 부모인 7과 마지막 6번 index 3의 자리를 바꾼다.

Desc9
가장 큰수를 찾아냈으니 이를 제외시키고 다시 한번 0번 index부터 최대 힙 구조를 만드는 반복과정을 거치면 된다.


Cord

#include <iostream>

#define LENGTH 7

using namespace std;

// 최대 힙 구성
void maxHeap(int _dataArr[], int _length)
{
    for (int idx = 1; idx < _length; idx++)
    {
        int child = idx;
        while (child != 0)
        {
            int root = (child - 1) / 2; // 자식으로 부터 root 알아내는 공식
            if (_dataArr[root] < _dataArr[child])
            {
                int temp = _dataArr[root];
                _dataArr[root] = _dataArr[child];
                _dataArr[child] = temp;
            }

            child = root;
        }
    }
}

int main()
{
    int dataArr[] = { 6, 5, 3, 2, 1, 0, 7 };
    maxHeap(dataArr, LENGTH);

    for (int idx = LENGTH - 1; idx >= 0; idx--)
    {
        // 가장 큰 숫자를 맨 마지막 원소와 자리 바꾸기
        int temp = dataArr[idx];
        dataArr[idx] = dataArr[0];
        dataArr[0] = temp;
        maxHeap(dataArr, idx);
    }

    // 결과 출력
    string result;
    for (int idx = 0; idx < LENGTH; idx++)
    {
        if (idx == LENGTH - 1)
        {
            result += dataArr[idx] + '0';
        }
        else
        {
            result += dataArr[idx] + '0';
            result += ", ";
        }
    }
    cout << "data = {" << result << " }";
    cout << "\n\n\n\n\n\n\n";

    return 0;
}

Result

Result