zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    eclipse,tortoise_svn
    sftp 命令
    shell 学习文档
    书籍,文档:shell
    V2配合proxifier以及免费ip的获取方法
    算法 | FastSLAM 1.0
    算法 | k-d树
    C++ | inline关键字和内联函数
    Python | Lambda 函数
    算法 | A*算法和权重A* 算法
  • 原文地址:https://www.cnblogs.com/liuyongliu/p/11237715.html
Copyright © 2011-2022 走看看