堆排序

摘要

堆排序和快速排序的复杂度都是nlongn;

代码

#include<bits/stdc++.h>
using namespace std;
int n,h[1000];
void swap(int x,int y){
	int k;
	k=h[x];
	h[x]=h[y];
	h[y]=k;
}
void siftdown(int i){//向下调整 
	int t;
	int flag=1;
	while(2*i<=n&&flag){
		//先与左子树比较
		if(h[i]>h[2*i]){
			t=2*i;
		} 
		else t=i;
		//再与右子树比较
		if(2*i+1<=n){
			if(h[t]>h[2*i+1])
			t=2*i+1;
		}
		
		if(t!=i)//有儿子比它小,交换
		{
			swap(t,i);
			i=t;//更换检查的位置 
		} 
		else flag=0;//父节点都大于左右儿子 符合,不需调整 
	}
}
//建立最小堆
void creat(){
	int i;
	for(i=n/2;i>=1;i--)
	{
		siftdown(i);
	}
} 
//删除元素
int delect(){
	int t;
	t=h[1];//保存最小值 
	h[1]=h[n];//把最后的元素弄到顶部
	n-=1;//节点数量变少 
	siftdown(1);//从新从顶部往下下调 
	return t; 
} 
int main(){
	int num,i;
	cin>>n;
		num=n;
		for(i=1;i<=num;i++)
		cin>>h[i];
		creat();
		for(i=1;i<=num;i++)
		cout<<delect()<<' ';
		cout<<endl;
	return 0;
}
posted @ 2018-10-09 10:36  ChunhaoMo  阅读(103)  评论(0编辑  收藏  举报