标签:
堆排序
利用到完全二叉树的有关知识,时间复杂度O(nlogn)
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> using namespace std; const int MAX_A = 100009; //使1到n元素为最大堆 void Adjust(int a[],int i,int n) { int l=2*i, r=2*i+1; int maxi=i; //父亲是否比孩子大 if(l<=n&&a[l]>a[maxi]) maxi=l; if(r<=n&&a[r]>a[maxi]) maxi=r; if(maxi!=i) { //交换 swap(a[i],a[maxi]); //保证调整以后以maxi为父节点的子树也为最大堆 Adjust(a,maxi,n); } } void Build(int a[],int n) { //建大顶堆,从有叶子节点那一层的最大处开始 for(int i=n/2; i>=1; i--) Adjust(a,i,n); } void Heap_sort(int a[],int n) { Build(a,n); for(int i=n; i>1; i--) { swap(a[1],a[i]); //只需调整root节点即可 Adjust(a,1,i-1); } } int main() { int a[MAX_A],n; while(~scanf("%d",&n)) { for(int i=1; i<=n; i++) scanf("%d",&a[i]); Heap_sort(a,n); for(int i=1; i<=n; i++) printf("%d ",a[i]); printf("\n"); } }
标签:
原文地址:http://www.cnblogs.com/stffer/p/5046214.html