배열, 연결리스트, 힙의 삽입과 삭제시 시간복잡도
힙이란 컴퓨터 분야에서 완전이진트리 기반의 "더미"와 모습이 비슷한 특정한 자료 구조를 의미한다.
힙은 여러 개의 값들 중에서 가장 큰 값이나 가장 작은 값을 빠르게 찾아내도록 만들어진 자료구조
힙은 완전이진트리다
키값(우선순위)는 중복 가능하다
최대 힙(max heap)
최소 힙(min heap)
#define MAX_ELEMENT 200
typedef struct {
int key;
} element;
typedef struct {
element heap[MAX_ELEMENT];
int heap_size;
} HeapType;
// 현재 요소의 개수가 heap_size인 히프 h에 item을 삽입한다.
// 삽입 함수
void insert_max_heap(HeapType *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;
}
먼저 정렬해야 할 n개의 요소들을 최대 또는 최소 힙에 삽입한다
한번에 하나씩 요소를 힙에서 삭제하여 저장한다
하나의 요소를 힙에 삽입하거나 삭제할때 시간이 O(log n) 만큼 소요되고 요소의 개수가 n개 이므로 정렬의 시간복잡도는 O(nlog n)이 걸린다.
void heap_sort(element a[], int n)
{
int i;
HeapType* h;
h = create(); //힙 생성
init(h); //초기화
for (i = 0; i<n; i++) {
insert_max_heap(h, a[i]);
}
for (i = (n - 1); i >= 0; i--) { //비내림차순 정렬
a[i] = delete_max_heap(h);
}
free(h);
}
Reference C언어로 쉽게 풀어 쓴 자료구조, 천인국, 공용해, 하상호_2019
상명대학교 홍철의 교수님 강의자료