堆排序

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1010];
void heapadjust(int s,int m)
{//建立新堆
    int temp,j;
    temp = a[s];//找最大值
    for(j=2*s;j<=m;j*=2)//二叉树的性质五
    {//求左孩子要乘2
        if(j<m&&a[j]<a[j+1])
           ++j;//此时右孩子为所求目标
        if(temp>=a[j])
            break;
        a[s]=a[j];
        s=j;
    }
    a[s]=temp;
}
int main()
{
    int n;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=n/2;i>0;i--)
        heapadjust(i,n);//首先n个元素建立堆
    for(int i=n;i>1;i--)
    {
        swap(a[1],a[i]);//不停交换第一个与最后一个的位置,因为重新建立堆后,第一个又为最大值
        heapadjust(1,i-1);//重新对i-1个元素建立堆
    }
    for(int i=1;i<=n;i++)
        printf("%d
",a[i]);
    return 0;
}
彼时当年少,莫负好时光。
原文地址:https://www.cnblogs.com/l609929321/p/6582049.html