• Source
    1. #include <stdio.h>
    2. #include <vector>
    3. using namespace std;
    4.  
    5. template<class T>
    6. void MaxHeapify(size_t parent_node, vector<T> & v)
    7. {
    8. size_t left_child = parent_node * 2 + 1;
    9. size_t right_child = parent_node * 2 + 2;
    10. size_t swap_index = parent_node;
    11.  
    12. if(right_child < v.size())
    13. {
    14. if(v[left_child] > v[right_child])
    15. {
    16. if(v[parent_node] < v[left_child])
    17. {
    18. swap_index = left_child;
    19. }
    20. }
    21. else
    22. {
    23. if(v[parent_node] < v[right_child])
    24. {
    25. swap_index = right_child;
    26. }
    27. }
    28. }
    29. else if(left_child < v.size())
    30. {
    31. if(v[parent_node] < v[left_child])
    32. {
    33. swap_index = left_child;
    34. }
    35. }
    36.  
    37. if(swap_index != parent_node)
    38. {
    39. swap(v[parent_node], v[swap_index]);
    40. MaxHeapify(swap_index, v);
    41. }
    42. }
    43.  
    44. template<class T>
    45. void BuildMaxHeap(vector<T> & v)
    46. {
    47. for(int i = v.size()/2; i >= 0; --i)
    48. {
    49. MaxHeapify<T>(i, v);
    50. }
    51. }
    52.  
    53. int main()
    54. {
    55. int numbers[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    56. vector<int> v(numbers, numbers + 9);
    57.  
    58. BuildMaxHeap<int>(v);
    59.  
    60. for(int i = 0; i < v.size(); ++i)
    61. {
    62. printf("%d ", v[i]);
    63. }
    64.  
    65. return 0;
    66. }