1. 程式人生 > 實用技巧 >小根堆及其排序

小根堆及其排序

#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