南邮 OJ 1066 堆排序

堆排序

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 365            测试通过 : 204 

比赛描述

给定输入排序元素数目n和相应的n个元素,写出程序,利用内排序算法中堆排序算法进行排序,并输出排序最后结果的相应序列。



输入

共两行,第一行给出排序元素数目n,第二行给出n个元素,1n100000,每个元素值范围为 [0100000)

输出

一行,输出排序结果。

样例输入

7
48 36 68 72 12 48 2

样例输出

2 12 36 48 48 68 72

提示

 数据结构A实验四

题目来源

CHENZ


#include<iostream>
using namespace std;

template<typename T>
void maxHeapify(T* a,long n,long i){
	int l=i*2+1,r=l+1;
	while(r<n){
		if(a[i]>a[l] && a[i]>a[r])
			return;
		if(a[l]>a[r]){
			swap(a[i],a[l]);
			i = l;
		}else{
			swap(a[i],a[r]);
			i = r;
		}
		l = i*2+1;
		r = l+1;
	}
	if(l<n && a[l]>a[i])
		swap(a[l],a[i]);
	return;
}

template<typename T>
void hSort(T* a,long n){
	long i;
	for(i=n-1;i>=0;--i)
		maxHeapify(a,n,i);
	while(n){
		swap(a[n-1],a[0]);
		--n;
		maxHeapify(a,n,0);
	}
}
int main(){
	long i,n,a[100000];
	cin>>n;
	for(i=0;i<n;++i)
		cin>>a[i];
	hSort(a,n);
	cout<<a[0];
	for(i=1;i<n;++i)
		cout<<" "<<a[i];
	cout<<endl;
}





你可能感兴趣的:(ACM,堆排序,南邮OJ)