(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´Â log2n¹ø ¸®½ºÆ® 13À» ¹Ýº¹ ¼ö
ÇàÇÏ°í ¸®½ºÆ® 13Àº O(n)¹øÀÇ ½Ã°£À» ¼Ò¿äÇϹǷΠÃÑ ¼Ò¿ä ½Ã°£Àº O(nlog2n)ÀÌ µÈ´Ù.