Altered
This commit is contained in:
6
BinaryTree/priorityQueue/maxHeap/CMakeLists.txt
Normal file
6
BinaryTree/priorityQueue/maxHeap/CMakeLists.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.31)
|
||||||
|
project(maxHeap)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
|
|
||||||
|
add_executable(maxHeap main.cpp)
|
78
BinaryTree/priorityQueue/maxHeap/main.cpp
Normal file
78
BinaryTree/priorityQueue/maxHeap/main.cpp
Normal 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
|
||||||
|
*/
|
110
BinaryTree/priorityQueue/maxHeap/maxHeap.h
Normal file
110
BinaryTree/priorityQueue/maxHeap/maxHeap.h
Normal 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
|
Reference in New Issue
Block a user