자료ꡬ쑰

[자료ꡬ쑰] 상ν–₯식 νž™μ •λ ¬ heapsort

mmin.h 2020. 8. 13. 22:16

μ•ˆλ…•ν•˜μ„Έμš” 주인μž₯ Hμž…λ‹ˆλ‹€. 

μ˜€λŠ˜μ€ νž™μ •λ ¬μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. 

 

νž™μ •λ ¬μ€ νž™νŠΈλ¦¬κ΅¬μ‘°λ₯Ό μ΄μš©ν•˜μ—¬ 정렬을 ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 

νž™μ€ μ΅œμ†Ÿκ°’μ΄λ‚˜ μ΅œλŒ“κ°’μ„ λΉ λ₯΄κ²Œ μ°Ύμ•„λ‚΄κΈ° μœ„ν•΄ μ™„μ „ 이진 트리λ₯Ό 기반으둜 ν•˜λŠ” νŠΈλ¦¬μž…λ‹ˆλ‹€. 

μ—¬κΈ°μ„œ μ™„μ „ μ΄μ§„νŠΈλ¦¬λž€ λΆ€λͺ¨λ…Έλ“œ(root)에 2개의 μžμ‹λ…Έλ“œ(c)λ₯Ό κ°€μ§„ ν˜•νƒœλ₯Ό λ§ν•©λ‹ˆλ‹€. 

νž™μ—λŠ” μ΅œλŒ€νž™κ³Ό μ΅œμ†Œν•©μ΄ μ‘΄μž¬ν•˜κ³ , μ΅œλŒ€ νž™μ€ λΆ€λͺ¨λ…Έλ“œκ°€ μžμ‹λ…Έλ“œλ³΄λ‹€ μ»€μ•Όν•©λ‹ˆλ‹€. 

 

νž™μ •λ ¬μ„ ν•˜κΈ°μœ„ν•΄μ„  μ •ν•΄μ§„ 데이터λ₯Ό νž™κ΅¬μ‘°λ‘œ λ§Œλ“  후에 μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€. 

νž™ 정렬을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄μ„  νž™ 생성 μ•Œκ³ λ¦¬μ¦˜(heapifiy Algorithm)을 μ‚¬μš©ν•©λ‹ˆλ‹€. 

νŠΉμ • λ…Έλ“œμ˜ 두 μžμ‹ 쀑 더 큰 μžμ‹κ³Ό μžμ‹ μ„ λ°”κΎΈλ©΄ λ©λ‹ˆλ‹€. 

 

예λ₯Ό λ“€μ–΄ 

   1

 4    9

2 3 4 4 

 

   9

 4    4

2 3 4 1 

둜 νž™κ΅¬μ‘°λ₯Ό λ§Œλ“€κ³  νŠΉμ • λ…Έλ“œ 9와 1을 μ„œλ‘œ λ°”κΎΈμ–΄ μ€λ‹ˆλ‹€ 

 

   1

 4    4

2 3 4  9

κ·Έ ν›„ 9λ₯Ό μ œμ™Έν•œ λ‹€λ₯Έ λ…Έλ“œλ“€μ„ λ‹€μ‹œ μ΅œλŒ€ν•­μ„ λ§Œλ“€μ–΄μ£ΌλŠ” 것을 λ°˜λ³΅ν•˜λ©΄

 

    2

 3    2

4 4 4  9  

의 ν˜•νƒœλ‘œ 정렬이 λ κ²ƒμž…λ‹ˆλ‹€. 

 

그럼 μœ„μ—μ„œλΆ€ν„° μ°¨λ‘€λŒ€λ‘œ μΈλ±μŠ€μ— λ„£μ–΄μ£Όλ©΄ 되겠죠. 

μ΄λ•Œ νž™μ •λ ¬μ˜ 전체 μ‹œκ°„ λ³΅μž‘λ„λŠ” 

νž™μƒμ„± μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„λ³΅μž‘λ„κ°€ O(log N)이고 전체 λ°μ΄ν„°μ˜ κ°―μˆ˜κ°€ Nμ΄λ―€λ‘œ 

O(log N * N)이 λ˜κ² μŠ΅λ‹ˆλ‹€. 

#include <stdio.h>
#define HEAPSIZE 9

int heap[HEAPSIZE] = { 1,5,3,6,2,6,6,4,9 };

//νž™ ꡬ쑰 λ§Œλ“€κΈ° 

int main(void) {
	for (int i = 1; i < HEAPSIZE; i++) {
		int c = i; 
		do {
			int root = (c - 1) / 2;
			if (heap[root] < heap[c]) {
				int temp = heap[root];
				heap[root] = heap[c];
				heap[c] = temp;
			} c = root; 
		} while (c != 0);
	}
	//크기λ₯Ό 쀄여가며 νž™ μ •λ ¬
	for (int i = HEAPSIZE - 1; i >= 0; i--) {
		int temp = heap[0]; 
		heap[0] = heap[i]; 
		heap[i] = temp; 
		int root = 0; 
		int c = 1; 
		//μžμ‹ 쀑에 큰 값이 μžˆλŠ”μ§€ 확인 
		do {
			c = 2 * root + 1; 
			if (c < i - 1 && heap[c] < heap[c + 1]) {
				c++;
			}
		//root 값이 더 크닀면 ꡐ체 
			if (c < i && heap[root] < heap[c]) {
				temp = heap[c];
				heap[c] = heap[root];
				heap[root] = temp; 
			}
			root = c; 
		} while (c < i);
	}
	for (int i = 0; i < HEAPSIZE; i++) {
		printf("%d ", heap[i]);
	}
	return 0;
}