#include #define INT_MAX 13 void upheap(int a[], int k) { int v; v = a[k]; /* v´Â k¹ø ³ëµåÀÇ Å°°ªÀ» °¡Áø´Ù */ a[0] = INT_MAX; while(a[k/2] <= v){ /* ºÎ¸ðÀÇ Ä«±â vº¸´Ù ÀÛÀ¸¸é »ðÀÔÇÑ´Ù */ a[k] = a[k/2]; k /= 2; } a[k] = v; /* Á¦ÀÚ¸®¿¡ v¸¦ ³õ´Â´Ù */ } void downheap(int a[], int n, int k) { int i, v; v = a[k]; while(k <= n/2){ /* k°¡ ³»ºÎ ³ëµåÀÎ °æ¿ì¿¡ ÇÑÇØ¼­ */ i = k<<1; /* i´Â ¿ÞÂÊ ÀÚ½Ä ¹øÈ£ */ if(i < n && a[i] < a[i+1]) i++; /* ¿ÞÂʰú ¿À¸¥ÂÊ ÀÚ½Ä Áß¿¡ Å« °ÍÀ» ¼±Åà */ if(v >= a[i]) break; /* Èü Á¶°ÇÀ» ¸¸Á·Çϸé Áß´Ü */ a[k] = a[i]; /* Èü Á¶°ÇÀ» ¸¸Á·ÇÏÁö ¾ÊÀ¸¸é »ðÀÔ */ k = i; } a[k] = v; /* k´Â v°¡ µé¾î°¡¾ß ÇÒ ÀÚ¸®ÀÌ´Ù */ } void insert(int a[], int *n, int v) { a[++(*n)] = v; /* ÈüÀÇ ³ëµå¼ö¸¦ Áõ°¡Çϰí v¸¦ Ãß°¡ */ upheap(a, *n); /* unheap µ¿ÀÛ ¼öÇà */ } int extract(int a[], int *n) /* remove ±â´ÉÀ» ÇÑ´Ù */ { int v = a[1]; /* a[i]´Â »Ñ¸®À̹ǷΠÈüÀÇ ÃÖ´ë°ª */ a[1] = a[(*n)--]; /* »Ñ¸®¿¡ ÈüÀÇ ¸»´Ü ³ëµå¸¦ ³Ö°í ³ëµå¼ö´Â °¨¼ÒÇÑ´Ù */ downheap(a, *n, 1); /* »Ñ¸®ÀÇ ³ëµå¸¦ ÈüÀÇ Á¶°Ç¿¡ ¸Â°Ô Çϰ­ */ return v; /* ¿ø·¡ »Ñ¸®ÀÇ °ª(ÈüÀÇ ÃÖ´ë°ª)À» ¸®ÅÏ */ } void heap_sort(int a[], int n) /* ÇÏÇâ½Ä Èü »ý¼ºÀ» ÀÌ¿ëÇÑ Èü Á¤·Ä */ { int i; int hn = 0; /* hnÀº ³ëµå¼öÀÌ´Ù. nÀº ¹è¿­ÀÇ Å©±â */ for(i=1; i<=n; i++) /* ¹è¿­ÀÇ °ªÀ» Â÷·Ê·Î Èü¿¡ »ðÀÔ */ insert(a, &hn, a[i]); /* a ¹è¿­À» ÈüÀ¸·Î »ç¿ëÇÔ */ for(i=hn; i>=1; i--){ /* ÈüÀÇ ÃÖ´ë°ªÀ» ²¨³»¾î ¿ª¼øÀ¸·Î ÀúÀåÇÑ´Ù */ a[i] = extract(a, &hn); } } /***************************************************************************** * * * --------------------------------- main --------------------------------- * * * *****************************************************************************/ void main(void) { int a[13] = {5, 4, 3, 2, 1, 6, 7, 8, 9, 10, 12, 11}; int i; heap_sort(a, 13); for(i=0; i<13; i++) printf("%3d", a[i]); }