(5) Èü Á¤·Ä¹ý (Heap Sorting)
¸ÕÀú Èü Á¤·ÄÀ» ÀÌÇØÇϱâ À§ÇÏ¿© È÷ÇÁ¶ó´Â
ÀڷᱸÁ¶¸¦ Á¤ÀÇÇÑ´Ù. ÀÌÁø Æ®¸®¸¦ ±â¾ï°ø°£¿¡ ÀúÀå
ÇÒ ¶§ ÀÏÂ÷¿ø ¹è¿À» »ç¿ëÇÑ´Ù. ÀÏÂ÷¿ø ¹è¿ÀÇ i¹øÂ° À§Ä¡ÇÑ ³ëµåÀÇ ºÎ¸ð À§Ä¡´Â
i/2 ÀÌ°í ¿ÞÂÊ
Àڽijëµå°¡ ÀÖ´Ù¸é 2*i À§Ä¡¿¡ ÀÖÀ¸¸ç ¿À¸¥ÂÊ ÀÚ½Ä ³ëµå°¡ ÀÖ´Ù¸é 2*i+1ÀÇ À§Ä¡¿¡
Á¸ÀçÇÑ´Ù(i/2
´Â i/2ÀÇ °á°ú¿¡¼ ¼Ò¼öÁ¡ ÀÌÇÏÀÇ ÀÚ¸®¼ö¸¦ ¹ö¸²). ¿ªÀ¸·Î ÀÏÂ÷¿ø ¹è¿¿¡ ÀúÀåµÈ
۰ªÀº ÀÌ·¯ÇÑ
À§Ä¡ °ø½Ä¿¡ ÀÇÇÏ¿© ÀÌÁø Æ®¸®·Î °£ÁÖµÉ ¼ö ÀÖ´Ù. È÷ÇÁ´Â ´ÙÀ½ÀÇ ¼ºÁúÀ» ¸¸Á·ÇÏ´Â
ÀÌÁø Æ®¸®ÀÌ´Ù.
1. È÷ÇÁ´Â ¿ÏÀü ÀÌÁø Æ®¸®ÀÌ´Ù.
2. ·çÆ®ÀÇ Å°°ªÀº ºÎºÐ Æ®¸®ÀÇ ³ëµåÀÇ Å°°ªº¸´Ù Å©°Å³ª °°´Ù.
3. ¿ÞÂÊ ºÎºÐ Æ®¸®¿Í ¿À¸¥ÂÊ ºÎºÐ Æ®¸® ¿ª½Ã À§ 2ÀÇ ¼ºÁúÀ» ¸¸Á·ÇÑ´Ù.
±×¸² 7Àº À§ÀÇ ¼ºÁúÀ» ¸¸Á·ÇÏ´Â È÷ÇÁ¿Í ÀÏÂ÷¿ø ¹è¿¿¡ ÀÌ·¯ÇÑ È÷ÇÁ¸¦ ÀúÀåÇÑ ¿¹¸¦ º¸¿©ÁØ´Ù.
(±×¸² 7) È÷ÇÁÀÇ ¿¹¿Í ÀÏÂ÷¿ø ¹è¿¿¡ ÀúÀåµÈ ÇüÅÂ
³ëµå¸¦ ÀúÀåÇÏ´Â À§Ä¡¸¦ »ç¿ëÇÏ¿© È÷ÇÁÀÇ ¼ºÁú
2¸¦ ´Ù½Ã Á¤ÀÇÇϸé K[i]>=K[2*i] (´Ü 2*i
<=n)À̰í K[i]>=K[2*i+1] (´Ü 2*i+1<=n)À¸·Î ³ªÅ¸³¾ ¼ö ÀÖ´Ù. ±×¸²
7¿¡¼ ÀÌ·¯ÇÑ ¼ºÁú
ÀÌ ¸¸Á·µÊÀ» ¾Ë¼ö ÀÖ´Ù. (ÀÌ Á¤ÀÇ´Â ÃÖ´ë È÷ÇÁ(max heap)¸¦ ³ªÅ¸³»¸ç ºÎµîÈ£°¡
¹Ý´ë ¹æÇâÀ̰í
ÃÖ¼Ò È÷ÇÁ(min heap)¸¦ ³ªÅ¸³½´Ù.)
È÷ÇÁ Á¤·ÄÀº µÎ ´Ü°è·Î ³ª´©¾î ½ÇÇàµÇ´Âµ¥ ¸ÕÀú Á¤·ÄÇϰíÀÚ ÇÏ´Â ¸®½ºÆ®¸¦
È÷ÇÁ ±¸Á¶·Î ¸¸µé°í
È÷ÇÁ ±¸Á¶¿¡¼ Á¤·ÄÀ» ¼öÇàÇÑ´Ù. adjust´Â ¾î´À ÇÑ
³ëµå x¿¡¼ x¸¦ ·çÆ®·Î ÇÏ´Â Æ®¸®¿¡¼ À̹Ì
È÷ÇÁ°¡ ÀÌ ¼ºÁúÀ» ¸¸Á·ÇÏ´Â ¿À¸¥ÂÊ ºÎºÐ Æ®¸®¿Í ¿ÞÂÊ ºÎºÐ Æ®¸®¸¦ Á¶Á¤ÇÏ¿© x¸¦ Æ÷ÇÔÇÏ´Â
Æ®¸® Àü
ü°¡ È÷ÇÁ°¡ µÇµµ·ÏÇÏ´Â ¾Ë°í¸®ÁòÀÌ´Ù. ¿¹¸¦ µé¸é ±×¸² 8°ú °°Àº Æ®¸®¸¦ »ìÆìº¸ÀÚ.

(±×¸² 8) adjust ¾Ë°í¸®ÁòÀ» À§ÇÑ ¿¹
±×¸² 8¿¡¼ x·Î Ç¥½ÃµÈ ³ëµå¸¦ ·çÆ®·Î ÇÏ´Â ºÎºÐ Æ®¸®´Â
ÇöÀç È÷ÇÁ ±¸Á¶°¡ ¾Æ´Ï³ª ±× ³ëµåÀÇ ¿Þ
ÂʺκРƮ¸®´Â °¢°¢ È÷ÇÁÀÇ ¼ºÁúÀ» ¸¸Á·ÇÑ´Ù. À̶§ ³ëµå x¸¦ ½ÃÀÛ ³ëµå·Î ÇÏ¿©
¿ÞÂÊ Àڽİú ¿À¸¥
ÂÊ ÀÚ½ÄÀ» ºñ±³ÇÏ¿© ´õ Å« ³ëµå¸¦ ¼±ÅÃ, ³ëµå x¿Í ºñ±³ÇÑ´Ù. ³ëµå x°¡ Å©¸é adjust
¾Ë°í¸®ÁòÀ»
¸ØÃß°í ³ëµåx°¡ ÀÛ´Ù¸é µÎ ³ëµå¸¦ ±³È¯ÇÏ¿© ±³È¯µÈ ÀÚ½Ä ³ëµå¿¡¼ ÀÌ·¯ÇÑ °úÁ¤À»
¹Ýº¹ÇÑ´Ù. ±×¸²
8ÀÇ ¿¹¿¡¼ °úÁ¤ÀÌ ¹Ýº¹µÇ´Â °ÍÀ» º¸ÀÌ¸é ±×¸² 9¿Í °°´Ù.

(±×¸² 9) adjust ¾Ë°í¸®ÁòÀÇ Àû¿ë ¿¹
À§¿¡¼ ¼³¸íµÈ adjust ¾Ë°í¸®ÁòÀ» ¼öÇàÇÏ¸é ³ëµå x¸¦ ·çÆ®·Î ÇÏ´Â ºÎºÐ Æ®¸®
Àüü°¡ È÷ÇÁ ±¸Á¶·Î
µÈ´Ù. À̶§ ³ëµå xÀÇ À§Ä¡°¡ iÀÌ¸é ¿ÞÂÊ ÀÚ½ÄÀÇ À§Ä¡´Â
2*iÀÌ°í ¿À¸¥ÂÊ ÀÚ½ÄÀÇ À§Ä¡´Â 2*i+1ÀÓ
¿¡ À¯ÀÇÇÏ¿© adjust ¾Ë°í¸®ÁòÀ» ÀÛ¼ºÇÏ¸é ¸®½ºÆ® 10°ú °°´Ù.
(¸®½ºÆ® 10) adjust ¾Ë°í¸®Áò
void adjust(int a[], int i, int n)
{
int j, k, done;
done=FALSE;
k=a[i];
j=2*i;
while ((j<=n)&&(!done)) /*
Àڽijëµå°¡ ÀÖ°í not doneÀÏ ¶§±îÁö ¹Ýº¹ */
{
if (j<n) /*
¿À¸¥ÂÊ Àڽijëµå°¡ Á¸ÀçÇϴ°¡? */
if (a[j]<a[j+1])
/* Àڽijëµåµé Áß Å« ³ëµå¸¦ ¼±Åà */
j=j+1;
if (k>=a[j])
done=TRUE;
/* Àڽijëµåº¸´Ù Å©¹Ç·Î ¹Ýº¹À» Áß´Ü
*/
else{
a[j/2]=a[j];
/* Àڽijëµå¿Í ±³È¯ */
j=2*j; }
}
a[j/2]=k;
}
¸®½ºÆ® 10¿¡¼ adjust ¾Ë°í¸®ÁòÀº ÃÖ¾ÇÀÇ °æ¿ì ½ÃÀÛ ³ëµå¿¡¼
°¡Àå ÇÏÀ§ÀÇ ³ëµå±îÁö ºñ±³Çؾß
ÇϹǷΠn°³ÀÇ ³ëµå¸¦ °®´Â ¿ÏÀü ÀÌÁø Æ®¸®¿¡¼´Â O(log2n)½Ã°£À» ÇÊ¿ä·Î ÇÑ´Ù.
È÷ÇÁ Á¤·ÄÀÇ Ã¹ ´Ü°è´Â Á¤·ÄÇϰíÀÚ ÇÏ´Â ¸®½ºÆ®¸¦ È÷ÇÁ ±¸Á¶·Î ¸¸µå´Â °ÍÀ¸·Î
Àüü ³ëµåÀÇ ¼ö°¡
n°³ÀÏ ¶§ i/2 ÀÇ À§Ä¡¿¡¼ ½ÃÀÛÇÏ¿© i/2
-1, i/2 -2,......,1ÀÇ À§Ä¡¿¡ ÀÖ´Â ³ëµå¸¦ ½ÃÀÛ ³ëµå·Î
adjust
¾Ë°í¸®ÁòÀ» ¹Ýº¹ ¼öÇàÇÑ´Ù. i/2 ÀÇ À§Ä¡¿¡¼ ½ÃÀÛÇÏ´Â ÀÌÀ¯´Â
i/2 +1, i/2 +2,......,n
À§Ä¡¿¡ ÀÖ´Â ³ëµåµéÀº ¸ðµÎ ´Ü¸» ³ëµåÀ̹ǷΠÀÌ¹Ì È÷ÇÁ ±¸Á¶¸¦ °¡Áö±â ¶§¹®ÀÌ´Ù.
±×¸² 10Àº Á¤·Ä
ÇϰíÀÚ Çϴ Ű°ªµéÀ» Ãʱâ È÷ÇÁ ±¸Á¶·Î ¸¸µå´Â °úÁ¤À» º¸¿©ÁØ´Ù.

(±×¸² 10) ÃʱâÀÇ È÷ÇÁ ±¸Á¶ ¸¸µé±â
±×¸² 10 (b)´Â n/2 ¹øÂ°, Áï 5¹øÂ° ³ëµå¿¡¼ adjust¸¦ ¼öÇàÇÑ
°á°ú¸¦ ³ªÅ¸³»¸ç, ³ëµå 4, 3, 2, 1
¿¡¼ Â÷·Ê·Î adjust°¡ ¼öÇàµÇ¾úÀ» ¶§ ±×¸² 10 (c)·Î µÇ¾î Àüü ¸®½ºÆ®°¡ È÷ÇÁ ±¸Á¶·Î
µÇ¾úÀ½À» ¾Ë
¼ö ÀÖ´Ù.
µÎ ¹øÂ° ´Ü°è¿¡¼´Â È÷ÇÁ ±¸Á¶¿¡¼ Á¤·ÄÀ» ¼öÇàÇÏ´Â °ÍÀ¸·Î ´ÙÀ½ÀÇ °úÁ¤À»
¹Ýº¹ÇÑ´Ù. Àüü Æ®¸®
ÀÇ ·çÆ®¸¦ ¸¶Áö¸· ³ëµå¿Í, Áï key[1]°ú key[n]À» ±³È¯ÇÑ ÈÄ ·çÆ®·ÎºÎÅÍ n-1°³ÀÇ ³ëµå¿¡
´ëÇÏ¿©
adjust ¾Ë°í¸®ÁòÀ» ¼öÇàÇÑ´Ù. ¹æ±Ý ±³È¯µÈ key[n]¿¡ ÀÖ´Â ³ëµå´Â adjust¿¡¼ Á¦¿ÜµÊ¿¡
À¯ÀÇÇ϶ó.
±×¸² 11Àº ±×·¯ÇÑ °úÁ¤À» º¸¿©ÁØ´Ù.

(±×¸² 11) È÷ÇÁ Á¤·ÄÀ» À§ÇÑ Ã¹ µ¿ÀÛ
ÀÌ·¯ÇÑ Á¶Á¤ÀÌ ³¡³ª¸é key[1]°ú key[n-1]À» ±³È¯ÇÑ ÈÄ Å©±â¸¦
n-2·Î ÇÏ¿© adjust ¾Ë°í¸®Áò
À»´Ù½Ã ¼öÇØÇÑ´Ù. ÀÌ·¯ÇÑ °úÁ¤À» n-1¹ø ¼öÇàÇÏ¸é ¸®½ºÆ®ÀÇ ¸¶Áö¸·¿¡¼ºÎÅÍ Â÷·Ê·Î
±³È¯µÈ ۰ª
µéÀÌ Á¤·ÄµÈ »óÅ·Π³²°Ô µÈ´Ù. ±×¸² 12´Â ÃÖÁ¾ Á¤·ÄÀÌ ¿Ï·áµÇ¾úÀ» ¶§ÀÇ ÀÏÂ÷¿ø ¹è¿¿¡
ÀúÀåµÈ Ű
µéÀ» º¸¿©ÁØ´Ù.

(±×¸² 12) È÷ÇÁ Á¤·ÄÀÇ ¼öÇà °á°ú
ÀÌ·¯ÇÑ °úÁ¤À» C ÇÁ·Î±×·¥À¸·Î ÀÛ¼ºÇÏ¸é ¸®½ºÆ® 11°ú °°´Ù.
(¸®½ºÆ® 11) È÷ÇÁ Á¤·Ä
void Heap(int n)
{
int i, temp;
for (i=(n/2);i>=1;--i) /*
Ãʱâ È÷ÇÁ ¸¸µé±â */
adjust(key, i, n);
for (i=(n-1);i>=1;--i) /*
È÷ÇÁ Á¤·ÄÀÇ µÎ ¹øÂ° ´Ü°è */
{
temp=key[i+1]; /*
i°³ÀÇ Å°¿¡ ´ëÇÏ¿© adjust Àû¿ë */
key[I+1]=key[1];
key[1]=temp;
adjust(key, 1, I);
}
}
È÷ÇÁ Á¤·ÄÀÇ ºÐ¼®
¸®½ºÆ® 11¿¡¼ ù ¹øÂ° for¹®Àº Á¤·ÄÇÒ ¸®½ºÆ®¸¦ Ãʱâ È÷ÇÁ ±¸Á¶·Î ¸¸µå´Â
ºÎºÐÀ̸ç O(n)½Ã°£
ÀÌ °É¸°´Ù°í ¾Ë·ÁÁ® ÀÖ´Ù. ±×¸®°í µÎ ¹øÂ° for¹®Àº È÷ÇÁ Á¤·ÄÀÇ µÎ ¹øÂ° ´Ü°è¸¦ À§ÇÑ
°ÍÀ¸·Î ÃÑ
n-1¹øÀÇ ±³È¯°ú adjust ¾Ë°í¸®ÁòÀ» ¼öÇàÇϹǷΠÇÑ ¹øÀÇ adjust ¾Ë°í¸®ÁòÀÌ
ÃÖ¾ÇÀÇ °æ¿ì
O(log2n)½Ã°£ÀÌ ¼Ò¿äµÇ¾î
ÃÑ O(nlog2n)½Ã°£ÀÌ
°É¸²À» ¾Ë ¼ö ÀÖ´Ù. µû¶ó¼ È÷ÇÁ Á¤·ÄÀ» À§ÇÑ
½Ã°£Àº O(nlog2n)ÀÌ µÈ´Ù.