堆排序

堆排序是源于树的,在此之前,我们要理解堆,堆相当与森林(许多树),且堆必为完全树

#include <bits/stdc++.h>
using namespace std;
const int maxn=100000+5;//n的最大长度
int a[maxn],len;
int main(){
	int n,k;
	cin>>n;
	for(int i=1;i<=n;i++){
	    cin>>a[i];
	    k=i;//定义k为当前最大深度
	    while(k>1/*k的位置不为根*/&&a[k]<a[k/2]/*当前节点小于它的父亲节点*/){
	        int tmp=a[k];//交换
	        a[k]=a[k/2];
	        a[k/2]=tmp;
	        k/=2;//将a[k]上浮一层
		}
	}
	len=n;
	for(int i=1;i<n;i++){
	    printf("%d ",a[1]);//持续输入根节点所在的数
	    a[1]=a[len--];//根节点所代表的树删去,替换成a串的最后一个
	    k=1;//k的位置为根节点
	    while((k*2<=len&&a[k]>a[k*2])||(k*2+1<=len&&a[k]>a[k*2+1])){//进行根节点此时代表数下浮
	    	int u=k*2;//假定u为左孩子
	    	if(u+1<=len&&a[u]>a[u+1])//看左孩子是否小于右孩子
	    	   u++;//换为右孩子
	    	int tmp=a[k];//进行交换
	    	a[k]=a[u];
	    	a[u]=tmp;
	    	k=u;//更新k值
		}
	}
	cout<<a[len];//输出串的最后一个
	return 0;
}
原文地址:https://www.cnblogs.com/jr-ag/p/9097198.html