#include <iostream> using namespace std; inline void _swap(int& a, int& b) { int temp = a; a = b; b = temp; } void heap_adjust(int* arr, int _begin, int _end) { int temp = arr[_begin]; int i; for(i = _begin*2; i <= _end; i*=2) { if(i < _end && arr[i] < arr[i+1]) i++; if(temp >= arr[i]) break; arr[i/2] = arr[i]; } arr[i/2] = temp; } void make_heap(int* arr, int& length) { for(int i = length/2; i >= 1; --i) heap_adjust(arr, i, length); } void pop_heap(int* arr, int& length) { arr[1] = arr[length]; heap_adjust(arr, 1, length-1); length--; } void push_heap(int* arr, int& length, int v) { int pre = length+1; for(int i = (length+1)/2; i >= 1; i/=2) { if(v < arr[i]) break; arr[pre] = arr[i]; pre = i; } arr[pre] = v; length++; } void print_heap(int* arr,int length) { int n = 1; for(int i = 1; i <= length; ++i) { if(i == n) { printf("/n"); n *= 2; } printf("%3d", arr[i]); } printf("/n"); } int main() { int length = 16; int arr[20] = {0, 1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16}; make_heap(arr, length); print_heap(arr, length); push_heap(arr, length, 12); print_heap(arr, length); pop_heap(arr, length); print_heap(arr, length); return 0; }