HW11

del.kiniah·2023년 5월 12일

문제) 아래의 배열 A이 주어졌을 때, 이를 MaxHeap을 구성하고, 내림차순 정렬한 결과를 콘솔창에 출력하세요.

A : 0, 10, -3, 7, 22, 33, 39, 4, -9, -5

- 교재 본문 소스코드를 본인 스타일로 변경한 코드 전체

#include <iostream>
#define MAX_ELEMENT 200

class HeapNode {
    int key;
public:
    HeapNode(int k = 0) : key(k) {}
    void setKey(int k) { key = k; }
    int getKey() { return key; }
    void display() { std::cout << key << " "; }
};

class MaxHeap {
    HeapNode node[MAX_ELEMENT];
    int size;
public:
    MaxHeap() : size(0) {}
    bool isEmpty() { return size == 0; }
    bool isFull() { return size == MAX_ELEMENT - 1; }

    HeapNode& getParent(int i) { return node[i / 2]; }
    HeapNode& getLeft(int i) { return node[i * 2]; }
    HeapNode& getRight(int i) { return node[i * 2 + 1]; }

    void insert(int key) {
        if (isFull()) return;
        int i = ++size;

        while (i != 1 && key > getParent(i).getKey()) {
            node[i] = getParent(i);
            i /= 2;
        }
        node[i].setKey(key);
    }

    HeapNode remove() {
        if (isEmpty()) return HeapNode();
        HeapNode item = node[1];
        HeapNode last = node[size--];
        int parent = 1;
        int child = 2;
        while (child <= size) {
            if (child < size && getLeft(parent).getKey() < getRight(parent).getKey())
                child++;
            if (last.getKey() >= node[child].getKey()) break;

            node[parent] = node[child];
            parent = child;
            child *= 2;
        }
        node[parent] = last;
        return item;
    }

    HeapNode find() { return node[1]; }

    void display() {
        for (int i = 1, level = 1; i <= size; i++) {
            if (i == level) {
                std::cout << std::endl;
                level *= 2;
            }
            node[i].display();
        }
        std::cout << "\n----------------------";
    }
};

- 배열 A가 주어졌을 때, MaxHeap을 이용해 내림차순 정렬하는 main 함수 코드 전체

int main() {
    int A[] = { 0, 10, -3, 7, 22, 33, 39, 4, -9, -5 }; //주어진 배열 A
    int arraySize = sizeof(A) / sizeof(A[0]); //배열에 담길 갯수
    MaxHeap maxHeap; //객체 maxHeap 선언
    for (int i = 0; i < arraySize; i++) { // 객체에 배열 A를 삽입
        maxHeap.insert(A[i]); //내림차순으로 들어가게 됨
    }

    std::cout << "내림차순으로 정렬한 결과: ";
    for (int i = 0; i < arraySize; i++) { 
        HeapNode node = maxHeap.remove(); // remove함수는 최대요소를 반환하고 그 값을 삭제한다. 반환한 최대 요소를 node에 저장한다.
        std::cout << node.getKey() << " "; //노드의 key값을 출력한다.
    }
    std::cout << std::endl;

    return 0;
}

- 콘솔창 출력 결과(캡쳐)

0개의 댓글