1098. Insertion or Heap Sort (25)堆排序

时间限制 1000 ms 内存限制 65536 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)

分析:

题目大意:给出n和n个数的序列a和b,a为原始序列,b为排序其中的一个步骤,问b是a经过了堆排序还是插入排序的,并且输出它的下一步~

参考:1098. Insertion or Heap Sort (25)-PAT甲级真题(堆排序)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define ll long long
const int inf=0x3f3f3f3f;
using namespace std;
int n;
int Sp[106],Sort1[106],Sort2[106];
int f=0;
void BFS(int x,int N)///一趟排序
{
    if(2*x>N) return ;
    else if(2*x==N){///不向下递归
        if(Sort1[x]<Sort1[2*x]) {
            swap(Sort1[x],Sort1[2*x]);
            f=1;
        }
    }
    else{
        f=1;
        if(Sort1[2*x]>Sort1[x] && Sort1[2*x]>Sort1[2*x+1]){
            swap(Sort1[2*x],Sort1[x]);

            BFS(2*x,N);
        }else if(Sort1[2*x+1]>Sort1[x] && Sort1[2*x+1]>Sort1[2*x]){
            swap(Sort1[2*x+1],Sort1[x]);
            BFS(2*x+1,N);
        }
    }
}

void Sort_Heap()///模拟堆排序
{
    for(int i=1;i<=n;i++) Sort2[i]=Sort1[i];
    for(int i=1;i<=n;i++) Sort1[i]=Sp[i];
    for(int i=n;i>=1;i--){///n次
        for(int j=i;j>=1;j--){
            BFS(j,i);
        }

        int ff=0;
        for(int j=i+1;j<=n;j++){
            if(Sort1[j]!=Sort2[j]){
                ff=1;
                break;
            }
        }
        if(ff) break;

        swap(Sort1[1],Sort1[i]);
    }
    cout<<Sort1[1];
    for(int ii=2;ii<=n;ii++) cout<<" "<<Sort1[ii];
    cout<<endl;
}
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>Sp[i];
    for(int i=1;i<=n;i++) cin>>Sort1[i];
    int i;
    for(i=2;i<=n;i++){
        if(Sort1[i]>Sort1[i-1]) continue;
        break;
    }
    int f=0,t=i;
    for(;i<=n;i++){
        if(Sort1[i]!=Sp[i]){
            f=1;    break;
        }
    }
    if(f==0){
        cout<<"Insertion Sort"<<endl;
        sort(Sort1+1,Sort1+1+t);///µÚt¸ö²åÈë
        cout<<Sort1[1];
        for(int i=2;i<=n;i++) cout<<" "<<Sort1[i];
    }else{
        cout<<"Heap Sort"<<endl;
        Sort_Heap();
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/liuyongliu/p/11237715.html