1098 Insertion or Heap Sort (25 分)(堆)

这里的第二序列相当于是排序还没拍好的序列

对于第二个样例的第二个序列其实已经是大顶堆了 然后才进行的堆排序 知道这个就好做了

#include<bits/stdc++.h>

using namespace std;
vector<int>a,b;
int n;
void downAdjust(int low,int high)
{
    int i=low;
    int j=i*2;
    while(j<=high){
        if(j+1<=high&&b[j]<b[j+1]){
            j=j+1;
        }
        if(b[j]>b[i]){
            swap(b[j],b[i]);
            i=j;
            j=i*2;
        }
        else break;
    }
}
int main()
{
    scanf("%d",&n);
    a.resize(n+1);
    b.resize(n+1);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) scanf("%d",&b[i]);
    int flag=2;
    while(flag<=n&&b[flag]>=b[flag-1]) flag++;
    int index=flag;
    while(flag<=n&&a[flag]==b[flag]) flag++;
    if(flag==n+1){
        printf("Insertion Sort
");
        sort(b.begin()+1,b.begin()+1+index);
        for(int i=1;i<=n;i++){
            if(i!=1) printf(" ");
            printf("%d",b[i]);
        }
    }
    else{
        printf("Heap Sort
");
        int f=n;
        while(f>1&&b[f-1]<=b[f]){
            f--;
        }

        swap(b[1],b[f]);
        downAdjust(1,f-1);
        for(int i=1;i<=n;i++){
            if(i!=1) printf(" ");
            printf("%d",b[i]);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/chenchen-12/p/10104697.html