PAT (Advanced Level) Practice 1098 Insertion or Heap Sort (25 分)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/84645400

好像还是第一次写堆排序,还是写点东西总结一下比较好
排序的思路就是每次把堆顶和堆尾的元素互换,那么此时可能会造成堆不满足大顶堆,就需要从头开始调整,调整肯定是2i和2i+1比,取两个中大的作为比较值,如果比儿子更大,则需要调节父子关系,一直到堆尾就调整结束了。
那么一开始构建最大堆也是同样的思路,从堆尾开始,把每个节点看成堆顶,那么就是堆顶的值发生了变化,所以调用排序调整堆顶的相同函数即可。

#include<cstdio>
#include<algorithm>
using namespace std;

const int N=100+5;

int n,a[N],b[N],c[N];

int same()
{
    for(int i=1;i<=n;i++)
        if(a[i]!=b[i])
            return 0;
    return 1;
}

void print()
{
    for(int i=1;i<=n;i++)
        printf("%d%c",a[i]," \n"[i==n]);
}

void insertS()
{
    int ss=0;
    for(int i=2;i<=n;i++)
    {
        int j=i;
        while(j>1&&a[j]<a[j-1]) swap(a[j-1],a[j]),j--;
        if(ss)
        {
            puts("Insertion Sort");
            print();
            return;
        }
        if(same()) ss=1;
    }
}

void adjust(int l,int r)
{
    while(2*l<=r)
    {
        int j=2*l;
        if(a[j]<a[j+1]&&j+1<=r) j++;
        if(a[l]<a[j]) swap(a[l],a[j]);
        else break;
        l=j;
    }
}

void heapS()
{
    for(int i=n/2;i>=1;i--)
        adjust(i,n);
    int ss=0;
    for(int i=n;i>=2;i--)
    {
        swap(a[i],a[1]);
        adjust(1,i-1);
        if(ss)
        {
            puts("Heap Sort");
            print();
            return;
        }
        if(same()) ss=1;
    }
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",a+i),c[i]=a[i];
    for(int i=1;i<=n;i++)
        scanf("%d",b+i);
    insertS();
    for(int i=1;i<=n;i++)
        a[i]=c[i];
    heapS();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Nightmare_ak/article/details/84645400