(6) ÇÕº´ Á¤·Ä¹ý(Merge Sorting)

 ÀϹÝÀûÀ¸·Î ÇÕº´(merge)À̶õ °¢°¢ Á¤·ÄµÈ ¸®½ºÆ®µéÀ» ÇϳªÀÇ Á¤·ÄµÈ ¸®½ºÆ®·Î ¸¸µå´Â °ÍÀÌ´Ù.
ƯÈ÷ 2°³ÀÇ ¸®½ºÆ®¸¦ ÇÕº´ÇÏ´Â °ÍÀ» 2¿ø ÇÕº´(two way merge)À̶ó Çϸç ÇÕº´ÀÇ ¿¹¸¦ ±×¸²À¸·Î
³ªÅ¸³»¸é ±×¸² 13°ú °°´Ù.


(±×¸² 13) ÀÌ¿ø ÇÕº´ÀÇ ¿¹

 ÇÕº´ Á¤·Ä¿¡¼­´Â ÇÕº´ÇϰíÀÚ ÇÏ´Â 2°³ÀÇ ¸®½ºÆ®°¡ ¹è¿­¿¡ Á¸ÀçÇÑ´Ù. µÎ ¸®½ºÆ®´Â °¢°¢ ½ÃÀÛ À§
Ä¡¿Í ³¡ À§Ä¡¿¡ ÀÇÇÏ¿© ±¸º°µÈ´Ù. ±×¸² 13ÀÇ 2°³ÀÇ ¸®½ºÆ®´Â ±×¸² 14¿Í °°ÀÌ ÀúÀåµÈ´Ù.


 (±×¸² 14) ÀÏÂ÷¿ø ¹è¿­¿¡¼­ÀÇ ÀÌ¿ø ÇÕº´

 ±×¸² 14¿¡¼­ ÇÕº´ÇϰíÀÚ ÇÏ´Â 2°³ÀÇ ¸®½ºÆ®´Â ÀÏÂ÷¿ø  ¹è¿­ X¿¡ ÀúÀåµÇ¾î ¼­·Î ÀÎÁ¢Çϸç À§Ä¡
¸¦ ³ªÅ¸³»±â À§ÇÏ¿© º¯¼öµé f, m, nÀ» »ç¿ëÇÑ´Ù. ÇÕº´µÈ °á°ú´Â  °°Àº Å©±âÀÇ ÀÏÂ÷¿ø ¹è¿­Z¿¡ Àú
ÀåµÈ´Ù. ÀÌ·¯ÇÑ ÇÕº´ °úÁ¤À» ÇÁ·Î±×·¥À¸·Î ÀÛ¼ºÇÏ¸é ¸®½ºÆ® 12¿Í °°´Ù.

(¸®½ºÆ® 12) ÀÌ¿ø ÇÕº´
void Merge(int x[], int z[], int f[], int m, int n)
{
    int i, j, k, t;

    i=f;           /* ù ¸®½ºÆ®ÀÇ ½ÃÀÛ À§Ä¡ */
    j=m+1;        /* µÑ° ¸®½ºÆ®ÀÇ ½ÃÀÛ À§Ä¡ */
    k=f;           /* ÇÕº´ °á°ú¸¦ ÀúÀåÇÒ ¸®½ºÆ®ÀÇ ½ÃÀÛ À§Ä¡ */
    while ((i<=m)&&(j<=n))   /* µÎ ¸®½ºÆ®Áß Çϳª°¡ ³¡³¯ ¶§±îÁö ¹Ýº¹ */
    {
        if (x[i]<=x[j])
        {
            z[k]=x[i];          /* ù ¸®½ºÆ®ÀÇ Å°°ªÀ» À̵¿ */
            i=i+1;
        }
        else
        {
            z[k]=x[j];         /* µÑ° ¸®½ºÆ®ÀÇ Å°°ªÀ» À̵¿ */
            j=j+1;
        }
        k=k+1;
    }
    if (i>m)
        for (t=j;t<=n;t++)     /* µÑ° ¸®½ºÆ®¿¡¼­ ³²Àº ۰ªÀ» À̵¿ */
            z[k+t-j]=x[t];
    else
        for (t=i;t<=m;t++)    /* ù ¸®½ºÆ®¿¡¼­ ³²Àº ۰ªÀ» À̵¿ */
            z[k+t-i]=x[t];
}

 ¸®½ºÆ® 12ÀÇ Merge ¾Ë°í¸®ÁòÀÇ ½Ã°£À» ºÐ¼®Çϸé while ·çÇÁ´Â µÎ ¸®½ºÆ® Áß ¾î´À ÇϳªÀÇ ¸®
½ºÆ®ÀÇ ¸¶Áö¸· ۰ªÀÌ Z·Î À̵¿ÇßÀ» ¶§ ³¡³­´Ù. ±×¸®°í µÎ ¸®½ºÆ® Áß ¾î´À ÇÑ ¸®½ºÆ®¿¡ ³²Àº Ű
µéÀÌ for¹®¿¡ ÀÇÇÏ¿© Z·Î À̵¿µÇ¹Ç·Î ÃÑ ½Ã°£Àº µÎ ¸®½ºÆ®ÀÇ Å°°ªµéÀÇ ¼ö¿¡  ÀÇÇÏ¿© °áÁ¤µÈ´Ù.
µû¶ó¼­ O(n-f+1)ÀÇ ½Ã°£ÀÌ ¼Ò¿äµÈ´Ù.
 ÇÕº´ Á¤·Ä¿¡¼­´Â À§¿¡¼­ ¼³¸íµÈ ÇÕº´ ¾Ë°í¸®ÁòÀ» ¹Ýº¹Çؼ­ »ç¿ëÇÑ´Ù. ¸ÕÀú ÇÕº´µÉ ¸®½ºÆ®ÀÇ
±æÀÌ(Áï ¸®½ºÆ®¿¡ Æ÷ÇÔµÈ Å°µéÀÇ ¼ö)¸¦ 1·Î ÇÏ°í µÎ ¸®½ºÆ®¸¦ ½ÖÀ¸·Î ÇÕº´À» ¼öÇàÇÏ¿© ±æÀ̰¡
2ÀÎ n/2°³ÀÇ ¸®½ºÆ®¸¦ ¸¸µç´Ù. °è¼ÓÇÏ¿© ±æÀÌ 2ÀÎ µÎ ¸®½ºÆ®¸¦ ½ÖÀ¸·Î ÇÏ¿© ±æÀÌ 4ÀÎ ¸®½ºÆ®·Î
ÇÕº´ÇÑ´Ù. ÀÌ·¯ÇÑ ÇÕº´ °úÁ¤Àº ±æÀ̰¡ nÀÎ ÇϳªÀÇ ¸®½ºÆ®·Î ÇÕº´µÉ ¶§±îÁö ¹Ýº¹ÇÑ´Ù. ÀÌ·¯ÇÑ
 ÇÕº´ °úÁ¤Àº ±æÀ̰¡ nÀÎ ÇϳªÀÇ ¸®½ºÆ®·Î ÇÕº´µÉ ¶§±îÁö ¹Ýº¹ÇÑ´Ù. ÀÌ·¯ÇÑ °úÁ¤À» ¿¹·Î µé¸é
±×¸² 15¿Í °°´Ù.  ±×¸² 15¿¡¼­ ÇÕº´µÈ ¸®½ºÆ®¸¦ ½±°Ô ±¸º°Çϱâ À§ÇÏ¿© ´ë°ýÈ£([ ])¸¦ »ç¿ëÇÑ´Ù.


(±×¸² 15) ÇÕº´ Á¤·ÄÀÇ ¿¹

 ±×¸² 15¿¡¼­ ÇÕº´ÇÒ ¸®½ºÆ®¸¦ ½ÖÀ¸·Î ¹­À» ¶§ ¸¶Áö¸· ³²Àº ¸®½ºÆ®ÀÇ Â¦ÀÌ ¾øÀ» ¶§´Â ±× ¸®½ºÆ®
¸¦ ±×·¡·Î ³²°ÜµÐ´Ù. ÇÕº´ Á¤·ÄÀÇ ¾Ë°í¸®ÁòÀ» ÀÛ¼ºÇϱâ Àü¿¡ ±×¸²  15¿¡¼­¿Í °°ÀÌ Àüü ÇÕº´ Á¤
·ÄÀº ÇÕº´ÇÒ ¸®½ºÆ®ÀÇ ±æÀÌ¿¡ µû¶ó ¸î ´Ü°è·Î ³ª´©¾îÁ® ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ÇÑ ´Ü°è¿¡¼­ ÇÕº´ÇÒ
¸®½ºÆ®ÀÇ ½ÖµéÀº ¸ðµÎ °°Àº ±æÀÌÀ̸ç ÀÎÁ¢ÇØ ÀÖ´Ù. ´Ü ¸¶Áö¸· ½ÖÀº ¼­·Î ´Ù¸¥ ±æÀÌ ÀÏ ¼ö  ÀÖ´Ù.
µû¶ó¼­ °¢ ´Ü°è¸¦ ÇÁ·Î±×·¥À¸·Î ÀÛ¼ºÇÒ ¶§ ÇØ´ç ´Ü°è¿¡¼­ Àû¿ëµÇ´Â ±æÀ̸¦ ¸Å°³ º¯¼ö·Î ¹Þ¾Æµé
¿© µÎ ¸®½ºÆ®ÀÇ  ½ÃÀÛ À§Ä¡¿Í ³¡ À§Ä¡¸¦ °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é, ±æÀÌ 1ÀÎ ¸®½ºÆ®¸¦ ÇÕº´ÇÒ¶§
ÇÕº´ÇÒ ½ÖµéÀÇ À§Ä¡ º¯¼öµé (f, m, n)Àº (1, 2, 3), (3, 3, 4), (5, 5, 6)......ÀÇ ¼øÀ¸·Î °áÁ¤µÈ´Ù.
µû¶ó¼­ ÇÕº´ÇÒ ¸®½ºÆ®ÀÇ ±æÀ̸¦ ¸Å°³ º¯¼ö  length¿¡ ¹Þ¾ÆµéÀÏ ¶§, i=1ÀÇ ÃʱⰪ¿¡ ´ëÇÏ¿© (i, i+
length-1, i+2*length-1)·Î °áÁ´µÇ¸ç ¸Å¹ø i=i+2*length·Î  Áõ°¡½ÃŲ´Ù. ±æÀ̰¡ 2ÀÏ ¶§µµ ÀÌ
·¯ÇÑ °ø½ÄÀÌ Àû¿ëµÉ ¼ö ÀÖÀ½À»  ¾Ë ¼ö ÀÖ´Ù. µû¶ó¼­ ÀÌ·¯ÇÑ ¹æ¹ýÀ¸·Î length¸¦ ¸Å°³ º¯¼ö·Î ¹Þ¾Æ
µé¿© ÇÑ ´Ü°è¸¦ ¼öÇàÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ¸é ¸®½ºÆ® 13°ú °°´Ù.

(¸®½ºÆ® 13) ÇÕº´ Á¤·ÄÀÇ ÇÑ ´Ü°è
void Merge_Pass(int x[], int y[], int n, int length)
{
    int i, t;
    i=1;
    while (i<=(n-2*length+1))     /* ±æÀ̰¡ lengthÀÎ ÀÎÁ¢ÇÑ µÎ ¸®½ºÆ®¸¦ °è¼ÓÇØ¼­ ÇÕº´ */
    {
        Merge(x, y, i, i+length-1, i+2*length-1);
        i=i+2*length;
    }
    if ((i+length-1)<n)
        Merge(x, y, i, i+length-1, n);     /* ³²Àº µÎ ¸®½ºÆ®¸¦ ÇÕº´ */
    else
    {
        for (t=i;t<=n;t++)                /* ³²Àº ÇϳªÀÇ ¸®½ºÆ®ÀÇ Å°°ªµéÀº ±×´ë·Î À̵¿ */
            y[t]=x[t];
    }
}

 ¸®½ºÆ® 13ÀÇ Merge_Pass´Â ÇÕº´ÇϰíÀÚ ÇÏ´Â ¸®½ºÆ® XÀÇ Å°µéÀ» ÇÕº´ÇÑ ÈÄ, ¸ðµÎ ¸®½ºÆ®
Z¿¡ ÀúÀåÇϹǷΠ¿¬»ê ½Ã°£Àº O(n)ÀÌ µÈ´Ù. ÀÌÁ¦ °¢ ´Ü°è¿¡¼­ ÇÕº´ÇÒ  ¸®½ºÆ®ÀÇ ±æÀ̸¦ °áÁ¤
ÇÏ¿© ¸®½ºÆ® 13À» ¹Ýº¹½ÃŰ´Â ºÎºÐÀ» ÀÛ¼ºÇϸé ÇÕº´ Á¤·ÄÀÌ µÇ°í ¸®½ºÆ® 14¿Í °°ÀÌ ÀÛ¼ºÇÒ
¼ö ÀÖ´Ù.

(¸®½ºÆ® 14) ÇÕº´ Á¤·Ä
void Merge_Sort(int x[], int n)
{
    int length;
    int y[SIZE];

    length=1;          /* ¸®½ºÆ®ÀÇ ±æÀ̸¦ 1·Î ÃʱâÈ­ */
    while (length<n)   /* ÇÕº´µÈ ¸®½ºÆ®ÀÇ ±æÀ̰¡ nÀÌ µÉ ¶§±îÁö ¹Ýº¹ */
    {
        Merge_Pass(x, y, n, length);    /* x¿¡ ÀúÀåµÈ ¸®½ºÆ®¸¦ y¿¡ ÇÕº´ */
        length=2*length;                /* ¸®½ºÆ®ÀÇ ±æÀ̸¦ µÎ¹è·Î ¸¸µç´Ù */
        Merge_Pass(y, x, n, length);    /* y¿¡ ÀÚÀåµÈ ¸®½ºÆ®¸¦ x¿¡ ÇÕº´ */
        length=2*length;                /* ¸®½ºÆ®ÀÇ ±æÀ̸¦ µÎ¹è·Î ¸¸µç´Ù */
    }
}

ÇÕº´ Á¤·ÄÀÇ ºÐ¼®

 ¸®½ºÆ® 14´Â ¸®½ºÆ®ÀÇ ±æÀ̰¡ ¸Å¹ø 2¹è¾¿ Áõ°¡ÇϹǷΠ¹Ýº¹ Ƚ¼ö´Â  log2nÀ̸ç ÇÕº´ÇÑ ¸®½º
Æ®ÀÇ ±æÀ̰¡ nÀÌ µÇ¸é Á¤·ÄÀÌ ¿Ï·áµÈ´Ù. µû¶ó¼­ ¸®½ºÆ® 14´Â log
2n¹ø ¸®½ºÆ®  13À» ¹Ýº¹ ¼ö
ÇàÇÏ°í ¸®½ºÆ® 13Àº O(n)¹øÀÇ ½Ã°£À» ¼Ò¿äÇϹǷΠÃÑ ¼Ò¿ä ½Ã°£Àº O(nlog
2n)ÀÌ µÈ´Ù.