From 87b3b926d34c60e750b7f5a7d93c20593b8dfd09 Mon Sep 17 00:00:00 2001 From: estomm Date: Tue, 16 Mar 2021 19:08:05 +0800 Subject: [PATCH] =?UTF-8?q?heap=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 数据结构/6.8.cpp | 86 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 5 deletions(-) diff --git a/数据结构/6.8.cpp b/数据结构/6.8.cpp index 56637c72..991ab7ee 100644 --- a/数据结构/6.8.cpp +++ b/数据结构/6.8.cpp @@ -5,7 +5,9 @@ using namespace std; class MaxQueue { public: // 实现最大堆吧。使用数组实现 - + MaxQueue() { + // cout<<111< max_queue; // 创建堆 MaxQueue(vector vec) { @@ -16,25 +18,99 @@ public: } // 堆顶值.即队首的元素 int max_value() { + if(max_queue.size()==0)return -1; return max_queue.front(); } // 插入元素,插入最后,进行上浮操作 void push_back(int value) { max_queue.push_back(value); - shift_up(max_queue.size()-1); + // 如果大小为1,不需要上浮 + if(max_queue.size()==1)return; + shift_up((max_queue.size()-1)/2); } // 删除元素,交换到最后删除,进行下降操作。 int pop_front() { + if(max_queue.size()==0)return -1; + int temp = max_queue.front(); swap(max_queue.front(),max_queue.back()); max_queue.pop_back(); + // 如果大小为1或者0,不需要下沉。 + if(max_queue.size()<=1)return temp; shift_down(0); + return temp; } // 向上调整 void shift_up(int pos){ - + int left = 2*pos+1; + int right = 2*pos+2; + // 超出范围,说明是最后一个叶节点 + int max; + if(right>max_queue.size()-1 ){ + if(max_queue[left]>max_queue[pos])swap(max_queue[left],max_queue[pos]); + if(pos==0)return; + shift_up((pos-1)/2); + return ; + } + if(max_queue[left]>max_queue[right]){ + max=left; + } + else{ + max=right; + } + if(max_queue[max]>max_queue[pos]){ + swap(max_queue[max],max_queue[pos]); + } + if(pos==0)return; + shift_up((pos-1)/2); + return ; } // 向下调整 void shift_down(int pos){ - + // 不是最后的飞叶节点 + if(pos>max_queue.size()/2-1)return; + int left = 2*pos+1; + int right = 2*pos+2; + int max; + // 超出范围,说明是最后一个叶节点 + if(right>max_queue.size()-1){ + if(max_queue[left]>max_queue[pos])swap(max_queue[left],max_queue[pos]); + return; + } + if(max_queue[left]>max_queue[right]){ + max=left; + } + else{ + max=right; + } + if(max_queue[max]>max_queue[pos]){ + swap(max_queue[max],max_queue[pos]); + } + shift_down(max); } -}; \ No newline at end of file + + void display(){ + for(int i:max_queue){ + cout< vec{0,1,2,3,4,5}; + // MaxQueue mq=MaxQueue(vec); + // mq.display(); + // cout<