(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(log
2n)½Ã°£À» ÇÊ¿ä·Î ÇÑ´Ù.
 È÷ÇÁ Á¤·ÄÀÇ Ã¹ ´Ü°è´Â Á¤·ÄÇϰíÀÚ ÇÏ´Â ¸®½ºÆ®¸¦ È÷ÇÁ ±¸Á¶·Î ¸¸µå´Â °ÍÀ¸·Î Àüü ³ëµåÀÇ ¼ö°¡
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(log
2n)½Ã°£ÀÌ ¼Ò¿äµÇ¾î  ÃÑ O(nlog2n)½Ã°£ÀÌ °É¸²À» ¾Ë ¼ö ÀÖ´Ù. µû¶ó¼­ È÷ÇÁ Á¤·ÄÀ» À§ÇÑ
½Ã°£Àº O(nlog
2n)ÀÌ µÈ´Ù.