20-2-¶ó.Äü Á¤·Ä

Äü Á¤·Ä(Quick Sort)Àº À̸§ ±×´ë·Î ¼Óµµ°¡ ´ë´ÜÈ÷ ºü¸¥ Á¤·Ä ¾Ë°í¸®ÁòÀÌ´Ù. Å« ¹è¿­À» ÀÏÁ¤ÇÑ ±âÁذªÀ» °æ°è·Î ÇÏ¿© ±âÁذªº¸´Ù Å« °ªµé°ú ÀÛÀº °ªµé·Î ±¸¼ºµÈ ÀÛÀº µÎ °³ÀÇ ¹è¿­·Î ºÐÇÒÇÑ´Ù. ±×¸®°í ºÐÇÒµÈ °¢ ¹è¿­À» ¶È°°Àº ¹æ¹ýÀ¸·Î ´Ù½Ã Á¤·ÄÇÏ´Â Á¡ÁøÀûÀÎ ¹æ¹ýÀ» »ç¿ëÇÑ´Ù. ¿¹Á¦¸¦ º¸ÀÚ.

 

¿¹ Á¦ : QuickSort

#include <Turboc.h>

 

#define SWAP(a,b) { int t;t=a;a=b;b=t; }

void QuickSort(char *ar, int num)

{

     int left,right;

     char key;

 

     // ±¸°£ÀÌ 1À̸é Á¤·Ä ³¡

     if (num <= 1) return;

 

     // ±âÁذª °áÁ¤ : ¹è¿­»óÀÇ Á¦ÀÏ ³¡ ¿ä¼Ò

     key=ar[num-1];

     for (left=0,right=num-2;;left++,right--) {

          while (ar[left] < key) { left++; }

          while (ar[right] > key) { right--; }

          if (left >= right) break;            // Á¿찡 ¸¸³ª¸é ³¡

          SWAP(ar[left],ar[right]);

     }

     SWAP(ar[left],ar[num-1]);                   // ±âÁذª°ú iÀ§Ä¡ÀÇ °ª ±³È¯

 

     QuickSort(ar,left);                           // ¿ÞÂÊ ±¸°£ Á¤·Ä

     QuickSort(ar+left+1,num-left-1);        // ¿À¸¥ÂÊ ±¸°£ Á¤·Ä

}

 

void main()

{

     char str[]="greathuman";

 

     printf("Á¤·Ä ÀüÀÇ ¹®ÀÚ¿­ : %s\n",str);

     QuickSort(str,strlen(str));

     printf("Á¤·ÄµÈ ¹®ÀÚ¿­ : %s\n",str);

}

 

"greatehuman"À̶ó´Â ¹®ÀÚ¿­À» Äü Á¤·ÄÇϸé "aaeghmnrtu"°¡ µÈ´Ù. Å« ¹è¿­À» ºÐÇÒÇϱâ À§ÇØ ¸ÕÀú ±âÁذªÀ» ¼±Á¤Çϴµ¥ ¹è¿­ ¼±µÎ³ª ¸¶Áö¸·À» ±âÁذªÀ¸·Î »ç¿ëÇÏ´Â °ÍÀÌ °¡Àå ½±´Ù. ±×¸®°í for ·çÇÁ¿¡¼­ ¹è¿­ÀÇ ¿ÞÂʰú ¿À¸¥ÂÊ¿¡ °¢°¢ left, right Æ÷ÀÎÅ͸¦ µÎ°í Áß¾ÓÀ¸·Î À̵¿Çϸ鼭 left¿¡ ±âÁذªº¸´Ù Å« °ª, right¿¡ ±âÁذªº¸´Ù ÀÛÀº °ªÀ» ã´Â´Ù. ±×¸®°í µÎ °ªÀ» ±³È¯ÇÏ¿© ±âÁذªº¸´Ù ÀÛÀº °ªÀº ¹è¿­ÀÇ ¿ÞÂÊÀ¸·Î º¸³»°í Å« °ªÀº ¿À¸¥ÂÊÀ¸·Î º¸³½´Ù.

ÀÌ °úÁ¤À» left¿Í right°¡ ¸¸³¯ ¶§±îÁö ¹Ýº¹Çϴµ¥ À̶§ left ´Â ±âÁذªº¸´Ù Å« °ªÀ» °¡¸®Å²´Ù. left¿Í ±âÁذªÀ» ±³È¯ÇÏ¿© left°¡ °¡¸®Å°´Â °ªÀ» ¹è¿­ ³¡À¸·Î º¸³»¸é ±âÁذªÀÇ ¿ÞÂÊ¿¡´Â ÀÌ °ªº¸´Ù ÀÛÀº °ª¸¸ ÀÖ°í ¿À¸¥ÂÊ¿¡´Â ´õ Å« °ª¸¸ ÀÖÀ» °ÍÀÌ´Ù. ±âÁذªÀÌ ÀÖ´Â À§Ä¡ÀÇ ¿ÞÂÊ ±¸°£°ú ¿À¸¥ÂÊ ±¸°£À» ¶È°°Àº ¹æ¹ýÀ¸·Î Á¤·ÄÇ쵂 ±¸°£ Å©±â°¡ 1ÀÌ µÉ ¶§±îÁö ÀÌ °úÁ¤À» ¹Ýº¹Çϸé Àüü ¹è¿­ÀÌ Á¤·ÄµÈ´Ù. ±×¸²À¸·Î À§ ¿¹Á¦ÀÇ µ¿ÀÛÀ» °üÂûÇØ º¸ÀÚ.

ÀÌ ¿¹¿¡¼­ ±âÁذªÀº ¹è¿­ Á¦ÀÏ ³¡¿¡ ÀÖ´Â nÀ¸·Î ¼±Á¤µÇ¾ú´Ù. left´Â ¹è¿­ ¼±µÎ¿¡¼­ºÎÅÍ µÚÂÊÀ¸·Î À̵¿Çϸ鼭 nº¸´Ù ´õ Å« °ªÀ» ã°í right´Â ¹è¿­ ³¡¿¡¼­ºÎÅÍ ¾ÕÂÊÀ¸·Î À̵¿Çϸ鼭 nº¸´Ù ´õ ÀÛÀº °ªÀ» ã´Â´Ù. for ¹® ¾ÈÀÇ while·çÇÁ°¡ ÀÌ °Ë»öÀ» ¼öÇàÇϴµ¥ ÀÌ ¿¹¿¡¼­´Â ÃÖÃÊ left¿¡ rÀÌ °Ë»öµÇ°í right¿¡ a°¡ °Ë»öµÈ´Ù. °Ë»öµÈ µÎ °ªÀ» ±³È¯ÇÏ¿© ÀÛÀº °ªÀº °¡±ÞÀû ¹è¿­ÀÇ ¿ÞÂÊÀ¸·Î º¸³»°í Å« °ªÀº °¡±ÞÀû ¹è¿­ÀÇ ¿À¸¥ÂÊÀ¸·Î º¸³½´Ù. ´ÙÀ½ ·çÇÁ¿¡¼­ left¿Í right´Â °è¼Ó Áß¾ÓÀ¸·Î À̵¿ÇÏ¿© °¢°¢ t¿Í mÀ» ã¾Æ µÎ °ªÀ» ±³È¯ÇÑ´Ù.

ÀÌ °úÁ¤À» left°¡ rightº¸´Ù ´õ ÀÛÀ» µ¿¾È¿¡ ¹Ýº¹Çϴµ¥ ¼¼ ¹øÂ° ´Ü°è¿¡¼­ right°¡ h, left°¡ u¸¦ °¡¸®Å³ ¶§ µÎ Æ÷ÀÎÅÍ´Â À̵¿À» ÁßÁöÇÑ´Ù. ±×¸®°í ±âÁذª nÀ» left À§Ä¡ÀÇ °ª(±âÁذªº¸´Ù´Â ´õ Å©´Ù)°ú ±³È¯ÇÏ¸é ±âÁذªÀ» °æ°è·Î ÇÏ¿© ¿ÞÂÊ¿¡´Â nº¸´Ù ´õ ÀÛÀº °ª¸¸ ³²°í ¿À¸¥ÂÊ¿¡´Â ´õ Å« °ª¸¸ ³²°Ô µÈ´Ù. ÀÌ »óŸ¦ ¸¸µé¸é ¿ÞÂÊ, ¿À¸¥ÂÊ ±¸°£Àº ¾ÆÁ÷ Á¤·ÄÀÌ ´ú µÇ¾úÁö¸¸ ÁÂ¿ì ±¸°£°ú ±âÁذª ¼¼ ¿ä¼Ò¸¸ º¸¸é Á¤·ÄÀÌ ¿Ï·áµÇ¾ú´Ù.

³²Àº ÀÏÀº ÁÂ¿ì ±¸°£À» °³º°ÀûÀ¸·Î ´Ù½Ã Á¤·ÄÇÏ´Â °ÍÀε¥ ÀÌ ¹®Á¦´Â ÃÖÃÊÀÇ Á¤·Ä ¹®Á¦¿Í µ¿ÀÏÇϹǷΠÀç±Í È£Ãâ·Î ¹®Á¦¸¦ ÇØ°áÇÑ´Ù. ÁÂ¿ì ±¸°£ÀÇ ½ÃÀÛÁ¡°ú ±æÀ̸¦ ÀûÀýÈ÷ °è»êÇØ¼­ QuickSort ÇÔ¼ö¸¦ ´Ù½Ã È£ÃâÇÑ´Ù. QuickSort ÇÔ¼ö´Â ÁÖ¾îÁø Å©±âÀÇ ¹è¿­À» Á¤·ÄÇ쵂 ±¸°£ ±æÀ̰¡ 1¹Û¿¡ ¾ÈµÉ ¶§´Â Á¤·ÄÀÌ ÀÌ¹Ì ¿Ï·áµÈ °ÍÀ¸·Î º¸°í °ð¹Ù·Î ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾Ê´Ù¸é ±¸°£ÀÇ ³¡ °ªÀ» ±âÁØÀ¸·Î ´Ù½Ã Á¤·ÄÇϰí ÀÌ ´Ü°è¿¡¼­ »ý±ä ¶Ç ´Ù¸¥ ÀÛÀº ±¸°£µéÀ» Á¤·ÄÇϱâ À§ÇØ Àç±Í È£ÃâÀÌ ¹ß»ýÇÒ °ÍÀÌ´Ù.

Äü Á¤·ÄÀÇ ¼º´ÉÀº ±âÁذªÀ» ¾î¶»°Ô ¼³Á¤Çϴ°¡¿¡ µû¶ó °áÁ¤µÇ´Âµ¥ ±âÁذªÀÌ Áß°£°ª¿¡ °¡±î¿ï¼ö·Ï ÁÂ¿ì ±¸°£ÀÌ ±ÕÀÏÇÏ°Ô ºÐÇÒµÇ¾î ´õ »¡¸® Á¤·ÄÇÒ ¼ö ÀÖ´Ù. ÀÌ ¿¹Á¦¿¡¼­´Â ¹è¿­ÀÇ Á¦ÀÏ ³¡°ªÀ» ÃëÇ߱⠶§¹®¿¡ ¿î¿¡ µû¶ó ±âÁذªÀÌ °áÁ¤µÇ¸ç ÀÌ¹Ì Á¤·ÄµÇ¾î ÀÖÀ» °æ¿ì Ç×»ó Å« °ªÀÌ ¼±ÅÃµÇ¾î ¿ÞÂÊ ±¸°£¸¸ Ä¿Áö´Â ¹®Á¦°¡ ÀÖ´Ù. ±×·¡¼­ ±âÁذªÀ» ³­¼ö·Î ¼±ÅÃÇÏ¿© ÇÑÂÊÀ¸·Î Ä¡¿ìħÀ» ¹æÁöÇϰųª ¾Æ´Ï¸é ÀûÀýÇÑ Áß°£°ªÀ» ÃëÇÏ´Â ¹æ¹ýÀ» ¾²±âµµ ÇÑ´Ù.

¶Ç Àç±Í È£ÃâÀ» Çϱ⠶§¹®¿¡ ¹è¿­ÀÌ ¾ÆÁÖ Å¬ °æ¿ì ½ºÅà ¿À¹öÇ÷ο찡 ¹ß»ýÇÒ À§ÇèÀÌ Àִµ¥ ÀÌ·² ¶§´Â ÀÚü ½ºÅÃÀ» ¸¸µé¾î ºñÀç±ÍÇÏ´Â ¹æ½ÄÀ¸·Î °³¼±ÇÒ ¼ö ÀÖ´Ù. ¾Æ´Ï¸é ±¸°£ÀÌ ¾ÆÁÖ ÀÛÀ» ¶§´Â ´õ ÀÌ»ó Àç±Í È£ÃâÀ» ÇÏÁö ¸»°í ¼±Åà Á¤·ÄÀ̳ª »ðÀÔ Á¤·Ä°°Àº Á» ´õ °£´ÜÇÑ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ´Â ¹æ¹ýµµ ÈçÈ÷ »ç¿ëµÈ´Ù. ±×·¯³ª ¿äÁòÀº ½ºÅà ũ±â°¡ ¾ÆÁÖ ³Ë³ËÇϱ⠶§¹®¿¡ ±»ÀÌ ºñÀç±Í ¹æ½ÄÀ¸·Î ¹Ù²Ü ÇÊ¿ä±îÁö´Â žb´Ù.

Äü ¼ÒÆ®´Â ´Ù¸¥ Á¤·Ä ¾Ë°í¸®Áò¿¡ ºñÇØ »ó´ëÀûÀ¸·Î ¼Óµµ°¡ ºü¸£°í Å« ¹è¿­¿¡ ´ëÇØ¼­µµ Àß µ¿ÀÛÇϱ⠶§¹®¿¡ °¡Àå ³Î¸® »ç¿ëµÇ´Â Á¤·Ä ¾Ë°í¸®ÁòÀÌ´Ù. ±×·¡¼­ C Ç¥ÁØ ¶óÀ̺귯¸®´Â Äü ¼ÒÆ® ÇÔ¼öÀÎ qsort ÇÔ¼ö¸¦ Á¦°øÇϴµ¥ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇϸé ÀÓÀÇÀÇ ¹è¿­¿¡ ´ëÇØ Äü ¼ÒÆ®¸¦ ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¶È°°Àº ¹®ÀÚ¿­À» Ç¥ÁØ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© Äü ¼ÒÆ®ÇÑ´Ù.

 

¿¹ Á¦ : qsort

#include <Turboc.h>

 

int compare(const void *a, const void *b)

{

     if (*(char *)a == *(char *)b) return 0;

     if (*(char *)a > *(char *)b) return 1;

     return -1;

}

 

void main()

{

     char str[]="greathuman";

 

     printf("Á¤·Ä ÀüÀÇ ¹®ÀÚ¿­ : %s\n",str);

     qsort(str,strlen(str),sizeof(char),compare);

     QuickSort(str,strlen(str));

     printf("Á¤·ÄµÈ ¹®ÀÚ¿­ : %s\n",str);

}

 

Ãâ·Â °á°ú´Â ¾ÕÀÇ ¿¹¿Í µ¿ÀÏÇÏ´Ù. qsort´Â Äü ¼ÒÆ® ¾Ë°í¸®Áò´ë·Î ±¸°£À» ³ª´©¾î µ¥ÀÌÅ͸¦ ±³È¯Çϴµ¥ ´Ü, ºñ±³´Â µ¥ÀÌÅÍ Å¸ÀÔ¸¶´Ù ´Ù¸£¹Ç·Î »ç¿ëÀÚ°¡ Á÷Á¢ ÇØ¾ß ÇÑ´Ù. ºñ±³ÇÏ´Â ÇÔ¼ö¸¦ ¹Ì¸® ¸¸µé¾î µÎ°í qsort ÇÔ¼öÀÇ ¸¶Áö¸· Àμö·Î ºñ±³ ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ Àü´ÞÇÏ¸é µÈ´Ù. Ç¥ÁØ qsort ÇÔ¼ö´Â ¾î¼Àºí¸®·Î °íµµ·Î ÃÖÀûÈ­µÇ¾î ÀÛ¼ºµÇ¾úÁö¸¸ Àç±Í È£Ãâ»Ó¸¸ ¾Æ´Ï¶ó ºñ±³¸¦ À§ÇØ ÇÔ¼ö¸¦ È£ÃâÇϱ⵵ ÇϹǷΠ¼Óµµ´Â ¿ÀÈ÷·Á Á÷Á¢ ¸¸µç ÇÔ¼öº¸´Ù ´õ ´À¸®´Ù.

»ç½Ç ÀÌ ÇÔ¼ö¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù¸é Á¤·ÄÀ» Çϴµ¥´Â º° ºÒÆíÇÔÀÌ ¾øÀ» °ÍÀÌ´Ù. ±×·¯³ª qsort°¡ ¾Æ¹«¸® ÀÓÀÇÀÇ Å¸ÀÔ¿¡ ´ëÇØ¼­ Àß µ¿ÀÛÇÑ´Ù ÇÏ´õ¶óµµ ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Æ¯¼ö¼ºÀ» °¨¾ÈÇϸé ÀÌ ÇÔ¼ö·Î ¸ðµç Á¤·ÄÀ» ´Ù ÇÒ ¼ö´Â ¾ø´Ù. ¿¹¸¦ µé¾î Çѱ۰ú ¿µ¹®ÀÌ ¼¯¿© ÀÖ´Â ¹®ÀÚ¿­Àº qsort ÇÔ¼ö·Î Á¤·ÄÇÒ ¼ö ¾øÀ¸¸ç Á÷Á¢ Á¤·Ä ÇÔ¼ö¸¦ ¸¸µé¾î ½á¾ß ÇÑ´Ù.