Heap Sort
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

¸ñÂ÷

1 ¼Ò°³
2 Build Heap
3 Á¤·Ä ¾Ë°í¸®Áò
4 ¶Ç´Ù¸¥ ¿¹
5 ÄÚµå

1 ¼Ò°³

Heap Sort´Â Heap ÀڷᱸÁ¶¿¡ ±â¹ÝÀ» µÎ´Â Á¤·Ä¾Ë°í¸®ÁòÀ¸·Î, Heap ÀڷᱸÁ¶¿¡ ¿ø¼Ò¸¦ insert ÇÏ´Â ¹æ½ÄÀ¸·Î Á¤·ÄÀ» ÇÑ´Ù. Heap ÀڷᱸÁ¶´Â ÀÌÁøÆ®¸® ÇüŸ¦ °¡Áø´Ù. ¸¸¾à ºÎ¸ðÀÇ ³ëµåÀÇ Å° °ªÀÌ Ç×»ó ÀÚ½Ä ³ëµåÀÇ Å°°ªº¸´Ù Å©°Å³ª °°´Ù¸é max-heap À̶ó°í ÇϰÅ, ¹Ý´ë·Î ºÎ¸ð ³ëµåÀÇ Å°°ªÀÌ ÀڽijëµåÀÇ Å°°ªº¸´Ù Ç×»ó À۰ųª °°´Ù¸é min-heap À̶ó°í ÇÑ´Ù.

Èü¼ÒÆ®´Â Äü¼ÒÆ®¿Í ÀÚÁÖ ºñ±³µÈ´Ù. ÀÌ µÑÀº ´Ù¸¥ nearly-in-place ºñ±³ ±â¹ÝÀÇ Á¤·Ä¾Ë°í¸®Áò¿¡ ºñÇØ¼­ ¸Å¿ì È¿À²ÀûÀÎ °ÍÀ¸·Î ¾Ë·ÁÁ® ÀÖ´Ù. º¸ÅëÀº Äü¼ÒÆ®°¡ ´õ ºü¸¥ °ÍÀ¸·Î ¾Ë·ÁÁ® ÀÖÁö¸¸, ÃÖ¾ÇÀÇ °æ¿ì O(n2)ÀÇ ½Ã°£ÀÌ °É¸®±â ¶§¹®¿¡, µ¥ÀÌÅÍÀÇ ¾çÀÌ ¸Å¿ì ¸¹Àº °æ¿ì¿¡´Â ¼±Åÿ¡ À־ ½ÅÁßÀ» ±âÇÒ Çʿ䰡 ÀÖ´Ù.

Èü¼ÒÆ®´Â ÃÖ¾ÇÀÇ °æ¿ìO(n log n)½Ã°£ÀÌ ¼ÒºñµÈ´Ù.

ÀÌ ¾Ë°í¸®ÁòÀº ƯÈ÷ ½Ç½Ã°£À¸·Î ¿ø¼Ò°¡ ÁÖ¾îÁö´Â priority queue ¸¦ ±¸ÇöÇϴµ¥ À¯¸®ÇÏ´Ù.

À¥¹®¼­ °Ë»ö¿£ÁøÀ» ¿¹·Î µé¾îº¸ÀÚ. À̶§, ¹®¼­´Â ¹®¼­ÀÇ °íÀ¯¹øÈ£¿Í °¡ÁßÄ¡·Î ÀÌ·ç¾îÁø {did, score} ÀڷᱸÁ¶¸¦ °¡Áú °ÍÀÌ´Ù. ¸¸¾à 100000°³ÀÇ ¹®¼­°¡ °Ë»öµÇ¾ú´Ù¸é did¸¦ key·Î Á¤·ÄµÈ ¸®½ºÆ®¸¦ ¾òÀ» °ÍÀÌ´Ù. ±×·¸´Ù¸é À̰ÍÀ» ´Ù½Ã score¸¦ key·Î Á¤·ÄÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÀÌ °æ¿ì 100000°³ÀÇ °á°ú¸¦ quick sort¸¦ ÀÌ¿ëÇØ¼­ ¿ÏÀüÁ¤·ÄÇÏ´Â ¹æ¹ýµµ ÀÖ°ÚÁö¸¸, °Ë»ö°á°ú´Â top N °³¸¸ÀÌ Áß¿äÇÏ´Ù°í º¼ ¼ö ÀÖÀ¸¹Ç·Î, À̰ÍÀº Å« ³¶ºñ´Ù. ÇϳªÀÇ ÆäÀÌÁö¿¡ 10°³ÀÇ °Ë»ö°á°ú¸¦ Ãâ·ÂÇÑ´Ù°í Çϰí, 10ÆäÀÌÁö ±îÁö º¸¿©Áشٰí Çϸé ÃÖ´ë 100°³ÀÇ Top Score¸¸ À¯ÁöÇÏ¸é µÇ±â ¶§¹®ÀÌ´Ù. 100ÀÇ Å©±â¸¦ °¡Áö´Â priority queue¸¦ À¯ÁöÇÏ¸é µÈ´Ù. priority queue°¡ °¡µæ á´Ù¸é, ÃÖ¼Ò°ªÀ» ±â¾ïÇϰí ÀÖ´Ù°¡ »õ·Î¿î ¹®¼­ÀÇ score°¡ ÃÖ¼Ò°ªº¸´Ù Å©´Ù¸é ÀÌÀüÀÇ ÃÖ¼Ò°ªÀ» »èÁ¦ÇÑ´ÙÀ½¿¡ Æ®¸®¸¦ ÀçÁ¤·ÄÇÏ¸é µÉ °ÍÀÌ´Ù.

2 Build Heap

Heap Á¤·ÄÀº Á¤·ÄÀ» ½ÃÀÛÇϱâ Àü¿¡, Heap ÀڷᱸÁ¶·Î ¸¸µé¾î¾ß ÇÑ´Ù. ¿©±â¿¡¼­´Â MAX heapÀ» ¼±ÅÃÇØ¼­ ¼³¸íÀ» Çϵµ·Ï ÇÑ´Ù. ÀÌ °æ¿ì »óÀ§ ³ëµå´Â ¹Ýµå½Ã ÇÏÀ§ ³ëµåº¸´Ù ´õ Ä¿¾ß ÇÑ´Ù´Â °ÍÀÌ º¸ÀåµÇ¾î¾ß ÇÒ °ÍÀÌ´Ù.

HeapÀº Tree ÀڷᱸÁ¶¸¦ µû¸£±â ¶§¹®¿¡, ¼±ÅÃÇÑ ³ëµåÀÇ ÇÏÀ§³ëµå´Â (n*2)+1 °ú (n*2)ÀÓÀ» ¾Ë ¼ö ÀÖ´Ù.
UNSORTED
heap1.png PercDown(5,10) heap2.png
ÃÖÃÊ¿¡ 5¹øÂ° ³ëµå¿Í ÇÏÀ§ ³ëµåÀÎ 5*2¸¦ ºñ±³ÇØ ÇÔÀ» ¾Ë ¼ö ÀÖ´Ù. 5¹øÂ° ³ëµåÀÇ °ªÀÌ ´õ ÀÛÀ¸¹Ç·Î, swap ÇØÁØ´Ù.
PercDown (4,10)
heap3.png PercDown(3,10) heap4.png
4,3¹øÂ° ³ëµå¿¡¼­ µ¿ÀÏÇϰÔ, °¡Àå Å« °ªÀ¸·Î swap ÇÑ´Ù. ÀÌÈÄ ÀÌ °úÁ¤À» ¸î¹ø ¼öÇàÇϸé, ¿ÏÀüÇÑ Heap ÀڷᱸÁ¶¸¦ ¸¸µé ¼ö ÀÖ´Ù.
percDown (1,20)
heap5.png PercDown(1,10) heap6.png
ÀÌ·¸°Ô ÇØ¼­ max heapÀÌ ¸¸µé¾îÁ³´Ù.

3 Á¤·Ä ¾Ë°í¸®Áò

heap ÀڷᱸÁ¶´Â 1Â÷¿ø ¹è¿­À» ÀÌ¿ëÇØ¼­ Á¤ÀÇ µÈ´Ù. 2Áø Æ®¸®¸¦ ÀÏÂ÷¿ø ¹è¿­¿¡ ³ª¿­ÇÏ´Â °ÍÀ̶ó°í º¸¸éµÈ´Ù. À§ÀÇ sort µÈ heapÀº ´ÙÀ½°ú °°Àº ¹è¿­ ±¸Á¶¸¦ °¡Áú °ÍÀÌ´Ù.
68 32 65 21 26 19 31 ...
Á¤·ÄÀ» À§Çؼ­ °¢ ³ëµå´Â ºÎ¸ð³ëµåÀÇ À§Ä¡¸¦ ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù. ºÎ¸ð³ëµåÀÇ À§Ä¡´Â ´ÙÀ½°ú °°ÀÌ °è»êÇØ ³¾ ¼ö ÀÖ´Ù.
  • ³ëµåÀÇ À§Ä¡°¡ i ¶ó¸é
  • ¿ÞÂÊ Àڽijëµå : i/2
  • ¿À¸¥ÂÊ ÀÚ½Ä ³ëµå : (i/2) + 1
°¢ ³ëµåÀÇ À§Ä¡¸¦ ¾Ë¼ö ÀÖ°Ô µÇ¾úÀ¸´Ï ´ÙÀ½°ú °°Àº heap ÀÇ ¼ºÁúÀ» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
  * K[i] >= K[2*i] 
  * K[i] >= K[(2*i) + 1] 
 
heap Á¤·ÄÀº ¾Æ·¡ÀÇ µÎ´Ü°è¸¦ °ÅÄ¡°Ô µÈ´Ù.
  • ¸ÕÀú Á¤·ÄÇϰíÀÚ ÇÏ´Â ¸®½ºÆ®·Î ºÎÅÍ heap ÀڷᱸÁ¶¸¦ ¸¸µç´Ù.
  • heap Á¤·ÄÀ» ¼öÇàÇÑ´Ù.

4 ¶Ç´Ù¸¥ ¿¹

Ãâó: [http]¼¼»ó, ±× Áß½ÉÀÇ ³ª!! ºí·Î±×

5 ÄÚµå

void heapSort(int numbers[], int array_size) 
{ 
  int i, temp; 
  
  for (i = (array_size / 2)-1; i >= 0; i--) 
    siftDown(numbers, i, array_size - 1); 
  
  for (i = array_size-1; i >= 1; i--) 
  { 
    temp = numbers[0]; 
    numbers[0] = numbers[i]; 
    numbers[i] = temp; 
    siftDown(numbers, 0, i-1); 
  } 
} 
  
  
void siftDown(int numbers[], int root, int bottom) 
{ 
  int done, maxChild, temp; 
  
  done = 0; 
  while ((root*2 <= bottom) && (!done)) 
  { 
    if (root*2 == bottom) 
      maxChild = root * 2; 
    else if (numbers[root * 2] > numbers[root * 2 + 1]) 
      maxChild = root * 2; 
    else 
      maxChild = root * 2 + 1; 
  
    if (numbers[root] < numbers[maxChild]) 
    { 
      temp = numbers[root]; 
      numbers[root] = numbers[maxChild]; 
      numbers[maxChild] = temp; 
      root = maxChild; 
    } 
    else 
      done = 1; 
  } 
} 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.