#include<stdio.h> int N, number, h[5001],cnt=1; void Insert() { int now = cnt; h[cnt++] = number; while (now / 2 > 0 && number > h[now/2]) { h[now] = h[now / 2]; now /= 2; } h[now] = number; } void Delete() { int now = 1; int result = h[1], bigChild; int last = h[--cnt]; bigChild = h[now * 2] > h[now * 2 + 1] ? now * 2 : now * 2 + 1; while (bigChild < cnt && h[bigChild] > last) { h[now] = h[bigChild]; now = bigChild; bigChild = h[now * 2] > h[now * 2 + 1] ? now * 2 : now * 2 + 1; } h[now] = last; h[cnt] = result; printf("[%d] ", h[1]); for (int i = 2; i <= N; i++) printf("%d ", h[i]); printf("\n"); } int main() { int mode; scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d", &number); Insert(); } for (int i = 1; i <= N; i++) Delete(); return 0; } //힙은 인덱스 1부터 시작해야한다. 완전이진트리에서 부모-자식간 관계와 index를 1:1 대응하기 위해서 //cnt는 앞으로 넣어질 idx이다. 즉 cnt = 힙의 노드갯수+1
//자식의 갯수를 구분하여 연산할 필요가 없다.
while (bigChild < cnt && h[bigChild] > last)에서 걸러진다.
자식의 갯수가 하나만 있을 경우 자식노드 : [작은값=음수] [큰값=0] 이어서
bigchild = cnt가 되어도 while 조건에서 ㅁ
자료 구조인 힙을 구성하여
삭제연산을 수행하여 삭제연산의 결과를
힙의 마지막 위치에 넣고 힙의 범위를 하나 줄인다.
정렬된 값 : 노란색
힙의 범위 : 파란색
8
1 8 7 2 3 6 4 5
cnt = 9
[8] 5 7 3 2 6 3 1
cnt = 8
[7] 5 6 3 2 1 4 8cnt = 7
[6] 5 4 3 2 1 7 8cnt = 6
[5] 3 4 1 2 6 7 8cnt = 5
[4] 3 2 1 5 6 7 8cnt = 4
[3] 1 2 4 5 6 7 8cnt = 3
[2] 1 3 4 5 6 7 8cnt = 2
[1] 2 3 4 5 6 7 8cnt = 1
1 2 3 4 5 6 7 8
'Algorithm_library > 정렬' 카테고리의 다른 글
고찰1. 어떤 정렬이 가장 좋은가? (0) | 2016.12.06 |
---|---|
Quick_Sort[퀵정렬] (0) | 2016.12.05 |
Shell_Sort[쉘 정렬] (0) | 2016.12.04 |
Insertion_Sort[삽입정렬] (0) | 2016.12.04 |
Selection_Sort[선택정렬] (0) | 2016.12.04 |