问题 AN: 堆排序

内存限制:128 MB 时间限制:1 S
题面:传统 评测方式:文本比较 上传者:
提交:187 通过:145

题目描述

对n个数,要求用堆排序(最大堆)对其进行排序。

https://www.bilibili.com/video/BV1u3EDzXEeU/



#include <iostream>
#include <algorithm>
usingnamespacestd;
inta[100];
voidHeapAdjust(inti,intsize) //调整堆
{
    intlchild=2*i;      //i的左孩子节点序号
    intrchild=2*i+1;    //i的右孩子节点序号
    intmax=i;           //临时变量
    if(i<=size/2)         //如果i不是叶节点就不用进行调整
    {
        if(lchild<=size&&a[lchild]>a[max])
            max=lchild;
        if(rchild<=size&&a[rchild]>a[max])
            max=rchild;
        if(max!=i)
        {
            swap(a[i],a[max]);
            HeapAdjust(max,size);   //避免调整之后以max为父节点的子树不是堆
        }
    }
}
 
voidBuildHeap(intsize)   //建立堆
{
    inti;
    for(i=size/2;i>=1;i--)   //非叶节点最大序号值为size/2
        HeapAdjust(i,size);
         
    for(intc=1;c<=size;c++)
        cout<<a[c]<<" ";
    cout<<endl;
}
 
voidHeapSort(intsize)   //堆排序
{
    inti;
    BuildHeap(size);//建立为大顶堆
    for(i=size;i>1;i--)
    {
 
        swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面     
        HeapAdjust(1,i-1);     //重新调整堆顶节点成为大顶堆
        for(intc=1;c<=size;c++)
            cout<<a[c]<<" ";
        cout<<endl;
 
    }
}
 
intmain( )
{
    intsize;
    cin>>size;
    inti;
    for(i=1;i<=size;i++)
        cin>>a[i];
    HeapSort(size);
     
    return0;
}

输入格式

第一行一个n(n<1000)。第二行给出n个数。

输出格式

输出n行,每行n个数。第一行表示将n个数(将n个数看成一棵树)变成最大堆后的结果,第二行表示将上次结果的根节点交换到现有节点的最后一个节点(然后将除最后一个节点的数看成一颗树),然后将该剩余节点树从新变成最大堆后的结果输出(包括交换到最后的节点),依次类推。

输入样例 复制

6
7 1 6 4 3 5

输出样例 复制

7 4 6 1 3 5 
6 4 5 1 3 7 
5 4 3 1 6 7 
4 1 3 5 6 7 
3 1 4 5 6 7 
1 3 4 5 6 7

分类标签