小根堆及其排序
阿新 • • 發佈:2020-12-02
#include<iostream> #include<cstring> using namespace std; template<typename item> class smallest_heap{ private: item heap[10001]; int len; public: smallest_heap(); void push(item const &); void pop(); item top(); int size(); bool empty(); }; template<typename item> smallest_heap<item>::smallest_heap(){ len=0; memset(heap,0,sizeof(heap)); } template<typename item> void smallest_heap<item>::push(item const &n){ heap[++len]=n; int son=len,father=son/2; while(heap[son]<heap[father] && father>=1){ swap(heap[son],heap[father]); son=father,father=son/2; } } template<typename item> void smallest_heap<item>::pop(){ swap(heap[1],heap[len]); heap[len--]=0; int father=1,son=2; while(son<=len){ if(son<len && heap[son]>heap[son+1]) son++; if(heap[father]>heap[son]){ swap(heap[father],heap[son]); father=son,son=father*2; }else break; } } template<typename item> item smallest_heap<item>::top(){ return heap[1]; } template<typename item> int smallest_heap<item>::size(){ return len; } template<typename item> bool smallest_heap<item>::empty(){ return len; } smallest_heap<int> h; int n,ans; int main(){ cin>>n; for(int i=1;i<=n;i++){ int a; cin>>a; h.push(a); } while(h.size()>1){ int x=h.top(); h.pop(); int y=h.top(); h.pop(); h.push(x+y); ans+=x+y; } cout<<ans; return 0; } #include<cstring> template<typename item> class largest_heap{ private: item heap[10001]; int len; public: largest_heap(); void push(item const &); void pop(); item top(); int size(); bool empty(); }; template<typename item> largest_heap<item>::largest_heap(){ len=0; memset(heap,0,sizeof(heap)); } template<typename item> void largest_heap<item>::push(item const &n){ heap[++len]=n; int son=len,father=son/2; while(heap[son]>heap[father] && father>=1){ swap(heap[son],heap[father]); son=father,father=son/2; } } template<typename item> void largest_heap<item>::pop(){ swap(heap[1],heap[len]); heap[len--]=0; int father=1,son=2; while(son<=len){ if(son<len && heap[son]<heap[son+1]) son++; if(heap[father]<heap[son]){ swap(heap[father],heap[son]); father=son,son=father*2; }else break; } } template<typename item> item largest_heap<item>::top(){ return heap[1]; } template<typename item> int largest_heap<item>::size(){ return len; } template<typename item> bool largest_heap<item>::empty(){ return len;
小根堆的理解,利用小根堆的性質和方法去求得正確得解。
下面可以說是全網講的最好得堆排序。
https://blog.csdn.net/u010452388/article/details/81283998