This commit is contained in:
e2hang
2025-08-09 19:23:37 +08:00
parent ac48a86396
commit 17105e9e9e
13 changed files with 194 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
cmake_minimum_required(VERSION 3.31)
project(maxHeap)
set(CMAKE_CXX_STANDARD 20)
add_executable(maxHeap main.cpp)

View File

@@ -0,0 +1,78 @@
#include "maxHeap.h"
using namespace std;
int main() {
maxHeap<int> h;
h.push(9);
h.push(8);
h.push(7);
h.push(6);
h.push(5);
h.push(4);
h.push(3);
h.push(2);
h.push(1);
h.display();
/*
* 9
* 8 7
* 6 5 4 3
* 2 1
*/
h.push(10);
h.display();
h.push(11);
h.display();
h.push(12);
h.display();
/*
* 12
* 10 11
* 6 9 7 3
* 2 1 5 8 4
*/
h.pop();
h.display();
h.pop();
h.display();
h.pop();
h.display();
return 0;
}
/*
输出结果与预测的一致
9
8 7
6 5 4 3
2 1
10
9 7
6 8 4 3
2 1 5
11
10 7
6 9 4 3
2 1 5 8
12
10 11
6 9 7 3
2 1 5 8 4
11
10 7
6 9 4 3
2 1 5 8
10
9 7
6 8 4 3
2 1 5
9
8 7
6 5 4 3
2 1
*/

View File

@@ -0,0 +1,110 @@
//
// Created by PC on 25-8-9.
//
#ifndef MAXHEAP_H
#define MAXHEAP_H
#include <iostream>
#include <vector>
#include <bits/ostream.tcc>
template<class T>
class maxHeap {
private:
std::vector<T> data;
int dsize;
public:
maxHeap() : dsize(0) {}
~maxHeap() = default;
bool empty() const;
int size() const;
void pop();
void push(const T& x);
T& top();
void display();
};
template<class T>
bool maxHeap<T>::empty() const {
return data.size() == 0;
}
template<class T>
int maxHeap<T>::size() const {
return dsize;
}
template<class T>
void maxHeap<T>::pop() {
if (data.empty()) {
std::cerr << "Empty Heap!" << std::endl;
return;
}
data.at(0) = data.at(data.size() - 1);
dsize--;
data.pop_back();
//正确的下沉逻辑:(记住如下写法,短小精悍
//先找左节点(如果有)再找右节点(如果有)比较左右节点,选择更大的那个作为可能交换的目标
//如果当前节点已经比这个目标大 → 停 ;否则 → 交换并继续下沉
int index = 0;
int left = 2 * index + 1;
int right = 2 * index + 2;
while (left < data.size()) {
int largest = index;
if (data[left] > data[largest]) largest = left;
if (data[right] > data[largest]) largest = right;
if (largest == index) break;
std::swap(data[index], data[largest]);
index = largest;
left = 2 * index + 1;
right = 2 * index + 2;
}
}
template<class T>
void maxHeap<T>::push(const T &x) {
data.push_back(x); // 新元素放到末尾
dsize++;
int idx = dsize - 1; // 当前节点下标
while (idx > 0) {
int parent = (idx - 1) / 2;
if (data[idx] > data[parent]) { // 如果比父节点大,就交换
std::swap(data[idx], data[parent]);
idx = parent; // 继续向上
} else {
break; // 满足堆性质,结束
}
}
}
template<class T>
T & maxHeap<T>::top() {
if (data.empty()) {
std::cerr << "Empty Heap" << std::endl;
}
else {
return data[0];
}
}
template<class T>
void maxHeap<T>::display() {
int jmp = 1;
int cnt = jmp;
for (int i = 0; i < data.size(); ++i) {
std::cout << data.at(i) << " ";
cnt--;
if (cnt == 0) {
jmp *= 2;
cnt = jmp;
std::cout << std::endl;
}
}
std::cout << std::endl << std::endl;
}
#endif //MAXHEAP_H