15.Ž»ö°ú Á¤·Ä.
ÀÌ ÀåÀº ¹è¿À» Ž»öÇϰí Á¤·ÄÇϱâ À§ÇÑ ÇÔ¼öµéÀ» ¼³¸íÇϰí ÀÖ´Ù. ´ç½ÅÀº ¹è¿¿¡ ÀÖ´Â objectsÀÇ Å© ±â¿Í ¿ä¼ÒÀÇ Àüü°¹¼ö¿Í ÇÔ²², Àμö·Î½á Àû´çÇÑ ºñ±³ ÇÔ¼ö¸¦ ÁÙ¼ö ÀÖ´Ù.
15.1 ºñ±³ ÇÔ¼ö Á¤ÀÇÇϱâ.
¹è¿À» Á¤·ÄÇÏ´Â ¶óÀ̺귯¸® ÇÔ¼ö¸¦ »ç¿ëÇϱâ À§Çؼ, ´ç½ÅÀº ¾î¶»°Ô ±× ¹è¿ÀÇ ¿ä¼ÒµéÀ» ºñ±³ÇÒ°Í ÀÎÁö ¾Ë·ÁÁà¾ß¸¸ ÇÑ´Ù. À̰ÍÀ» ÇϱâÀ§ÇØ, ´ç½ÅÀº ¹è¿ÀÇ µÎ °³ÀÇ ¿ä¼Ò¸¦ ºñ±³Çϱâ À§ÇÑ ºñ±³ÇÔ¼ö¸¦ °ø±ÞÇÑ´Ù. ±× ¶óÀ̺귯¸®´Â ºñ±³Çϱâ À§ÇÑ µÎ °³ÀÇ ¹è¿ ¿ä¼ÒµéÀ» °¡¸®Å°´Â Æ÷ÀÎÅͰ¡ Àμö·Î½á ÁÖ ¾îÁö¸é, ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ °ÍÀÌ´Ù. ´ç½ÅÀÇ ºñ±³ÇÔ¼ö´Â strcmp( 5.5Àý [String/Array Comparison] 49 ÆäÀÌÁö ÂüÁ¶.)°¡ ÇÏ´Â ¹æ¹ýÀ¸·Î °ªÀ» ¸®ÅÏÇϴµ¥, ±× ¹æ¹ýÀ̶õ: ù ¹øÂ° Àμö°¡ µÎ ¹øÂ° Àμöº¸´Ù ÀÛ À¸¸é À½¼ö¸¦ ¸®ÅÏÇϰí, ¸¸ÀÏ °°À¸¸é 0À» ¸®ÅÏÇϰí, ù ¹øÂ°°¡ Å©¸é ¾ç¼ö¸¦ ¸®ÅÏÇÑ´Ù.
À̰÷¿¡¼´Â double ÇüÀÇ ¼ýÀÚµé·Î ÀÌ·ç¾îÁø ¹è¿À» °¡Áö°í ÀÛ¾÷ÇÏ´Â ºñ±³ÇÔ¼öÀÇ ¿¹°¡ ÀÖ´Ù.
int
compare_doubles (const double *a, const double *b)
{
return (int) (*a - *b);
}
Çì´õÆÄÀÏ 'stdlib.h'´Â ºñ±³ÇÔ¼öµéÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» À§ÇÑ À̸§À» Á¤ÀÇÇϰí ÀÖ´Ù. ÀÌ Å¸ÀÔÀº GNU È® ÀåÀÌ´Ù.
int comparison_fn_t (const void *, const void *);
15.2 ¹è¿ Ž»ö ÇÔ¼ö.
Á¤·ÄµÈ ¹è¿¿¡¼ Ű(key)°ª°ú °°Àº ¿ä¼Ò¸¦ Ž»öÇϱâ À§Çؼ´Â, bsearchÇÔ¼ö¸¦ »ç¿ëÇ϶ó. ÀÌ ÇÔ¼ö¸¦ À§ÇÑ ÇÁ·ÎÅäŸÀÔÀº Çì´õÆÄÀÏ 'stdlib.h'¿¡ ÀÖ´Ù.
ÇÔ¼ö : void *bsearch (const void *key, const void *array, size_t count, size_t size, comparison_fn_t compare)
bsearch ÇÔ¼ö´Â key ¿Í µ¿µîÇÑ ¿ÀºêÁ§Æ®¸¦ Á¤·ÄµÈ ¹è¿ array¿¡¼ ã´Â´Ù. ±× ¹è¿Àº size ¹ÙÀÌÆ®ÀÇ Å©±â¸¦ °¡Áø, count °³ÀÇ ¿ä¼Ò¸¦ °®´Â´Ù. compare ÇÔ¼ö´Â ºñ±³¸¦ ¼öÇàÇϴµ¥ »ç¿ëµÈ´Ù. ÀÌ ÇÔ¼ö´Â µÎ °³ÀÇ Æ÷ÀÎÅÍ Àμö·Î È£ÃâµÇ°í ù ¹øÂ° Àμö°¡ µÎ ¹øÂ° Àμöº¸´Ù Àû°Å³ª, °°°Å³ª, ¶Ç´Â Å¿¡ ÇØ´ç ÇÏ´Â Á¤¼ö¸¦ ¸®ÅÏÇÑ´Ù. ¹è¿ÀÇ ¿ä¼ÒµéÀº ÀÌ ºñ±³ÇÔ¼ö¿¡ ÀÇÇÏ¿© ¿À¸§Â÷¼øÀ¸·Î ¹Ì¸® Á¤·ÄµÇ¾îÁ®¾ß¸¸ ÇÑ´Ù.
¸®ÅϰªÀº key°ª°ú °°Àº ¹è¿ÀÇ ¿ä¼Ò¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ À̰ųª, ¶Ç´Â °°Àº ¿ä¼Ò¸¦ ¹ß°ßÇÏÁö ¸øÇÏ¸é ³Î Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ¸¸ÀÏ ±× ¹è¿ÀÌ key°ª°ú °°Àº °ÍÀ» ÇÑ °³ ÀÌ»ó °¡Áö°í ÀÖ´Ù¸é, ¸®ÅÏµÈ °Í Àº Á¤ÇØÁöÁö ¾Ê¾Ò´Ù. ÀÌ ÇÔ¼ö´Â ¹ÙÀ̳ʸ® Ž»ö ¾Ë·Î¸®ÁòÀ» »ç¿ëÇØ¼ µ¿ÀÛÇѴٴ°Ϳ¡ ±âÀÎÇÏ¿© bsearch¶ó´Â À̸§ÀÌ À¯·¡µÆ´Ù.
15.3 ¹è¿ Á¤·Ä ÇÔ¼ö
ºñ±³ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¹è¿À» Á¤·ÄÇϱâ À§Çؼ´Â, qsort ÇÔ¼ö¸¦ »ç¿ëÇ϶ó. ÀÌ ÇÔ¼ö¸¦ À§ÇÑ ÇÁ·ÎÅäŸ ÀÔÀº 'stdlib.h'¿¡ ÀÖ´Ù.
ÇÔ¼ö : void qsort (void *array, size_t count, size_t size, comparison_fn_t compare)
qsort ÇÔ¼ö´Â ¹è¿ array¸¦ Á¤·ÄÇÑ´Ù. ±× ¹è¿Àº sizeÀÇ Å©±â¸¦ °¡Áø count°³ÀÇ ¿ä¼Ò¸¦ °®´Â´Ù.
compare ÇÔ¼ö´Â ¹è¿ ¿ä¼ÒµéÀÇ ºñ±³¸¦ ¼öÇàÇϴµ¥ »ç¿ëµÈ´Ù. ÀÌ ÇÔ¼ö´Â µÎ °³ÀÇ Æ÷ÀÎÅÍ Àμö·Î È£ ÃâµÇ°í ù ¹øÂ° Àμö°¡ µÎ ¹øÂ° Àμö¿Í ºñ±³Çؼ Å«Áö, °°ÀºÁö, ÀûÀºÁö¸¦ ¾Ë ¼ö ÀÖ´Â °ªÀ» ¸®ÅÏÇÑ´Ù.
ÁÖÀÇ: ¸¸ÀÏ µÎ °³ÀÇ ¿ÀºêÁ§Æ®°¡ °°´Ù¸é, Á¤·ÄµÈ ÈÄÀÇ ±×µéÀÇ ¼ø¼´Â ¿¹ÃøÇÒ ¼ö ¾ø´Ù. ±×°ÍÀº ÀÌ Á¤·ÄÀÌ ¾ÈÁ¤ÀûÀÌÁö ¸øÇÏ´Ù´Â °ÍÀ» ¸»Çϰí ÀÖ´Ù. ¹è¿ÀÇ ´ÜÁö ÇѺκи¸À» °¡Áö°í ºñ±³¸¦ ÇÒ ¶§ µÎ °³ÀÇ ¿ä¼Ò°¡ °°´Ù°í ³ª¿À´Â °æ¿ì, ±×µéÀº ´ÜÁö key °ª¸¸ °°Àº »ÓÀÌÁö ´Ù¸¥ Á¡¿¡ À־ Â÷À̰¡ ÀÖÀ» °ÍÀÌ´Ù.
¸¸ÀÏ ´ç½ÅÀÌ ¾ÈÁ¤ÀûÀÎ Á¤·ÄÀ» ¿øÇÑ´Ù¸é, ´ç½ÅÀº µÎ °³ÀÇ ¿ä¼Ò»çÀÌ¿¡ ºÎÁ·ÇÑ ´Ù¸¥ Ãø¸éÀÇ Â÷À̳ª, ±× µéÀÇ ÁÖ¼Ò·Î ±×µéÀ» ºñ±³ÇÏ´Â °Í°ú °°Àº ºñ±³ ÇÔ¼ö¸¦ ½á¼ ÀÌ °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
À̰÷Àº À§¿¡ Á¤ÀÇµÈ ºñ±³ ÇÔ¼ö¸¦ »ç¿ëÇØ¼, ¼ýÀÚ ¼ø¼·Î doubleÇüÀÇ ¹è¿À» Á¤·ÄÇÏ´Â ¿¹¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. ( 15.1 [Comparison Functions] 217 ÆäÀÌÁö ÂüÁ¶.)
{
double *array;
int size;
. . .
qsort (array, size, sizeof (double), compare_doubles);
}
qsort ÇÔ¼ö´Â "Äü ¼ÒÆ®(quick sort)" ¾Ë°í¸®ÁòÀ» »ç¿ëÇØ¼ µ¿ÀÛÇÑ´Ù´Â »ç½Ç¿¡ ±âÀÎÇÏ¿© qsort¶ó´Â ÀÌ ¸§ÀÌ À¯·¡µÇ¾ú´Ù.
15.4 Ž»ö°ú Á¤·ÄÀÇ ¿¹.
À̰÷¿¡¼´Â ±¸Á¶Ã¼ÀÇ ¹è¿¿¡ qsort ¿Í bsearch¸¦ »ç¿ëÇÏ´Â ¿¹¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. ¹è¿ÀÇ ¿ÀºêÁ§Æ® µéÀº strcmp ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ±×µéÀÇ À̸§À» ºñ±³ÇÔÀ¸·Î½á Á¤·ÄµÇ¾îÁ³´Ù.
±×·¯¸é, ¿ì¸®´Â ±×µéÀÇ À̸§¿¡ ±âÃÊÇÑ °³°³ÀÇ ¿ÀºêÁ§Æ®µéÀ» »ìÆìº¼ ¼ö ÀÖ´Ù.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* Á¤·ÄÇÒ critterµéÀÇ ¹è¿À» Á¤ÀÇÇ϶ó. */
struct critter
{
const char *name;
const char *species;
};
struct critter muppets[] =
{
{"Kermit", "frog"},
{"Piggy", "pig"},
{"Gonzo", "whatever"},
{"Fozzie", "bear"},
{"Sam", "eagle"},
{"Robin", "frog"},
{"Animal", "animal"},
{"Camilla", "chicken"},
{"Sweetums", "monster"},
{"Dr. Strangepork", "pig"},
{"Link Hogthrob", "pig"},
{"Zoot", "human"},
{"Dr. Bunsen Honeydew", "human"},
{"Beaker", "human"},
{"Swedish Chef", "human"}
};
int count = sizeof (muppets) / sizeof (struct critter);
/* À̰ÍÀº Á¤·Ä°ú Ž»öÀ» À§ÇØ »ç¿ëÇÏ´Â ºñ±³ÇÔ¼öÀÌ´Ù. */
int
critter_cmp (const struct critter *c1, const struct critter *c2)
{
return strcmp (c1->name, c2->name);
}
/* critter¿¡ ´ëÇÑ Á¤º¸¸¦ ÇÁ¸°Æ®Ç϶ó. */
void
print_critter (const struct critter *c)
{
printf ("%s, the %s\n", c->name, c->species);
}
/* Á¤·ÄµÈ ¹è¿À» »ìÆìº¸¶ó */
void
find_critter (const char *name)
{
struct critter target, *result;
target.name = name;
result = bsearch(&target, muppets, count, sizeof (struct critter),
critter_cmp);
if (result)
print_critter (result);
else
printf ("Couldn't find %s.\n", name);
}
/* Main ÇÔ¼ö */
int
main (void)
{
int i;
for (i = 0; i < count; i++)
print_critter (&muppets[i]);
printf ("\n");
qsort (muppets, count, sizeof (struct critter), critter_cmp);
for (i = 0; i < count; i++)
print_critter (&muppets[i]);
printf ("\n");
find_critter ("Kermit");
find_critter ("Gonzo");
find_critter ("Janice");
return 0;
}
ÀÌ ÇÁ·Î±×·¥ÀÇ Ãâ·ÂÀº ´ÙÀ½°ú °°´Ù.
Kermit, the frog
Piggy, the pig
Gonzo, the whatever
Fozzie, the bear
Sam, the eagle
Robin, the frog
Animal, the animal
Camilla, the chicken
Sweetums, the monster
Dr. Strangepork, the pig
Link Hogthrob, the pig
Zoot, the human
Dr. Bunsen Honeydew, the human
Beaker, the human
Swedish Chef, the human
Animal, the animal
Beaker, the human
Camilla, the chicken
Dr. Bunsen Honeydew, the human
Dr. Strangepork, the pig
Fozzie, the bear
Gonzo, the whatever
Kermit, the frog
Link Hogthrob, the pig
Piggy, the pig
Robin, the frog
Sam, the eagle
Swedish Chef, the human
Sweetums, the monster
Zoot, the human
Kermit, the frog
Gonzo, the whatever
Couldn't find Janice.