Data Structure

힙 (Heap)

studioesso 2020. 4. 19. 19:43

삽입 시간 복잡도 -> O(logn)

삭제 시간 복잡도 -> O(logn)

 

/*
    코드 출처 : C언어로 쉽게 풀어쓴 자료구조 / 생능출판 / 천인국, 공용해, 하상호 지음
*/
#include <stdio.h>
#define MAX_ELEMENT 200

typedef struct {
    int key;
} element;

typedef struct {
    element heap[MAX_ELEMENT];
    int heap_size;
} HeapType;

//초기화 함수
init(HeapType *h) { h->heap_size = 0; }

//삽입 함수
void insert_max_heap(HeayType *h, element item)
{
    int i;
    i = ++(h->heap_size);
    
    while((i != 1) && (item.key > h->heap[i/2].key)) {
        h->heap[i] = h->heap[i/2];
        i /= 2;
    }
    h->heap[i] = item;
}

//삭제 함수
element delete_max_heap(HeapType *h)
{
    int parent, child;
    element item, temp;
    
    item = h->heap[1];
    temp = h->heap[(h->heap_size)--];
    parent = 1;
    child = 2;
    
    while(child <= h->heap_size) {
	    if((child < h->heap_size) && (h->heap[child].key) < h->heap[child+1].key) {
        	child++;
        }
        if(temp.key >= h->heap[child].key) break;
        
        h->heap[parent] = h->heap[child];
        parent = child;
        child *= 2;
	}
    
    h->heap[parent] = temp;
    return item;
}

void main() {
    element e1 = {10}, e2 = {5}, e3 = {30};
    element e4, e5, e6;
    HeapType heap;
    init(&heap);
    
    insert_max_heap(&heap, e1);
    insert_max_heap(&heap, e2);
    insert_max_heap(&heap, e3);
    
    e4 = delete_max_heap(&heap);
    e5 = delete_max_heap(&heap);
    e6 = delete_max_heap(&heap);
    
    printf("%d %d %d\n", e4.key, e5.key, e6.key);
}

'Data Structure' 카테고리의 다른 글

트리 (Tree)  (0) 2020.05.05
비트마스크 (Bitmask)  (0) 2020.04.28
큐 (Queue)  (0) 2020.04.23
스택 (Stack)  (0) 2020.04.22
연결 리스트 (Linked List)  (0) 2020.04.21