//调整index位置的元素,一般是第一个index=0//[0,heapSize)为大堆根段,具体理解可以结合全部代码中的堆排序函数heapSort()voidheapAdj(vector<int>& arr,int index,int heapSize){//将index与他左/右节点最大的交换int left =2* index +1;// index的左节点while(left < heapSize){//寻找左右节点的最大值下标int large = left +1< heapSize && arr[left+1]> arr[left]? left +1: left;//左右最大值和index比较
large = arr[large]> arr[index]? large : index;if(large == index){break;}swap(arr[large], arr[index]);
index = large;
left =2* index +1;}}
全部代码
main.cpp:
#include<bits/stdc++.h>#include"bigheap.h"usingnamespace std;intmain(){
vector<int> v{1,2,5,6};
BigHeap bh(v);
bh.push(10);
bh.push(4);
bh.push(3);
cout <<"大堆根:";for(auto a : bh.get()){
cout << a <<" ";}
cout << endl;
cout <<"大堆根弹出的顺序:"<< endl;int n = bh.size();for(int i =0; i < n; i++){
cout <<"top: "<< bh.top()<< endl;
bh.pop();}
vector<int> v1{1,2,45,20,5,6};
cout <<"堆排序:";
bh.heapSort(v1);for(auto a : v1){
cout << a <<" ";}
cout <<"你好"<< endl;return0;}
// 大堆根// Created by Ycq on 2022/6/8.//#ifndefCLIONTEST_BIGHEAP_H#defineCLIONTEST_BIGHEAP_H#include<vector>usingnamespace std;// 建立大堆根// 参考:https://blog.csdn.net/dream_follower/article/details/105202811// 数组以下标0开始,第i位置的左节点为2i+1,右节点为2i+2,父节点为(i-1)/2classBigHeap{private:
vector<int> vec;public:BigHeap(){}BigHeap(vector<int>&v):vec(v){heapBuild(vec);}//返回大堆数组
vector<int>get(){return vec;}//返回大堆顶inttop(){return vec[0];}//删除堆顶voidpop(){swap(vec[0], vec[vec.size()-1]);//将堆顶元素交换到数组尾部
vec.pop_back();//删除尾部元素heapAdj(vec,0, vec.size());//调整大堆}//添加元素voidpush(int x){
vec.push_back(x);heapInsert(vec, vec.size()-1);}//vec的大小intsize(){return vec.size();}//判空boolempty(){return vec.empty();}//在大堆根后面index位置的元素进行调整voidheapInsert(vector<int>& arr,int index){//将index和他的根节点比较,大于的话就交换while(arr[index]> arr[(index-1)/2]){//index=0时会终止循环swap(arr[index], arr[(index-1)/2]);
index =(index -1)/2;}}//调整index位置的元素,一般是第一个index=0voidheapAdj(vector<int>& arr,int index,int heapSize){//将index与他左/右节点最大的交换int left =2* index +1;// index的左节点while(left < heapSize){//寻找左右节点的最大值下标int large = left +1< heapSize && arr[left+1]> arr[left]? left +1: left;//左右最大值和index比较
large = arr[large]> arr[index]? large : index;if(large == index){break;}swap(arr[large], arr[index]);
index = large;
left =2* index +1;}}//建大堆根voidheapBuild(vector<int>& arr){int n = arr.size();if(n <2)return;for(int i =0; i < n; i++){//建大堆根heapInsert(arr, i);}}//堆排序, 不要给本对象的vec排序,由于使用的是引用传参,会改变vec,而使vec不满足大堆根的规则voidheapSort(vector<int>& arr){//其实就是依次把堆顶的元素放入数组尾部,每次heapSize减1(>0),最后arr是升序int n = arr.size();heapBuild(arr);//将第一个(堆顶)元素和最后一个元素交换swap(arr[0], arr[--n]);while(n >0){heapAdj(arr,0, n);swap(arr[0], arr[--n]);}}};#endif//CLIONTEST_BIGHEAP_H