// 20:50 // 22:31 #include const int N = 1000; class BigHeap { private: int *_internal_array; int len = 0; bool external = false; int get_left_child(int index) { return this->_internal_array[index * 2]; } int get_right_child(int index) { return this->_internal_array[index * 2 + 1]; } int get_parent(int index) { return this->_internal_array[index / 2]; } void adjust_up(int index) { while (index > 1 && this->_internal_array[index] > this->get_parent(index)) { std::swap(this->_internal_array[index], this->_internal_array[index / 2]); index /= 2; } } void adjust_down(int index) { while (index * 2 <= this->len) { int target = index; if (this->_internal_array[target] < this->get_left_child(index)) // 如果左节点更大 target = index * 2; // 左节点换上来 if (index * 2 + 1 <= this->len && this->_internal_array[target] < this->get_right_child(index)) // 如果右节点更大 target = index * 2 + 1; // 右节点换上来 if (index == target) break; // 如果满足了当前节点比左右子节点大,就不用继续下沉了 std::swap(this->_internal_array[index], this->_internal_array[target]); index = target; } } // 好像不太对,算了不用了,叶子节点直接判断就行了 int get_last_non_leaf_index(int len) { int pow_of_2 = 1; int times = 0; while (pow_of_2 < len) { pow_of_2 *= 2; // 也可以写成 pow_of_2 <<= 2; times++; } return times; } public: BigHeap() { // 构造函数,在初始化时被调用 this->_internal_array = new int[N]; } BigHeap(int *external_array, int len) { // 也是构造函数,但是使用外部的数组初始化,数组要从1开始 this->_internal_array = external_array; this->len = len; for (int i = this->len; i >= 1; i--) { adjust_down(i); } this->external = true; } ~BigHeap() { // 析构函数,在对象被删除时被调用 if (!this->external) delete this->_internal_array; } int get_length() { return this->len; } void insert(int num) { this->_internal_array[++this->len] = num; int index = this->len; adjust_up(index); } int pop() { int result = this->_internal_array[1]; this->_internal_array[1] = this->_internal_array[this->len--]; adjust_down(1); return result; } }; int a[N]; int len; int main() { std::cin >> len; for (int i = 1; i <= len; i++) std::cin >> a[i]; BigHeap big_heap_internal; for (int i = 1; i <= len; i++) { big_heap_internal.insert(a[i]); } std::cout << "逐个插入后,逐个弹出输出的结果为:" << std::endl; while (big_heap_internal.get_length() > 0) { std::cout << big_heap_internal.pop() << " "; } std::cout << std::endl; BigHeap big_heap_external(a, len); std::cout << "一次性初始化后,逐个弹出输出的结果为:" << std::endl; while (big_heap_external.get_length() > 0) { std::cout << big_heap_external.pop() << " "; } std::cout << std::endl; return 0; }