fork download
  1. #include <stdio.h>
  2.  
  3. #define XORSWAP(a, b) ((a)^=(b),(b)^=(a),(a)^=(b))
  4.  
  5. static int heap_size;
  6.  
  7. int parent(int i){
  8. return i >> 1;
  9. }
  10.  
  11. int left(int i){
  12. return i << 1;
  13. }
  14.  
  15. int right(int i){
  16. return (i << 1) | 0x1;
  17. }
  18.  
  19. void heapify(int *h, int i){
  20. int l = left(i);
  21. int r = right(i);
  22. int largest;
  23.  
  24. if(l <= heap_size && h[l] > h[i])
  25. largest = l;
  26. else
  27. largest = i;
  28.  
  29. if(r <= heap_size && h[r] > h[largest])
  30. largest = r;
  31.  
  32. if(largest != i){
  33. XORSWAP(h[i], h[largest]);
  34. heapify(h, largest);
  35. }
  36. }
  37.  
  38. void make_heap(int *h, int len){
  39. int i;
  40. heap_size = len;
  41.  
  42. for(i = len/2; i >= 1; i--)
  43. heapify(h, i);
  44. }
  45.  
  46. int main(int argc, char *argv[]){
  47. int i;
  48. int h[11] = {0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
  49.  
  50. make_heap(h, 11);
  51. for(i = 1; i < 11; i++)
  52. printf((i + 1 == 11) ? "%d" : "%d ", h[i]);
  53.  
  54. scanf("%d", &i);
  55. return 0;
  56. }
  57.  
Success #stdin #stdout 0s 2164KB
stdin
Standard input is empty
stdout
10 9 5 8 3 2 4 6 7 1