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