1098 Insertion or Heap Sort

Posted kkmjy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1098 Insertion or Heap Sort相关的知识,希望对你有一定的参考价值。

题意:给出两组数,第一组数为原始序列,第二组数为经过若干次插入排序或堆排序后的序列,判定到底是属于哪一种排序的结果,然后输出以这种排序的下一次迭代后的序列。

思路:就是练习插入排序和堆排序,没什么好说的。不过有一个小细节,我被扣了2分。见代码。

代码:

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> ori,data,temp;
int n;
int flag=-1;//0:Insertion Sort; 1:Heap Sort

void downAdjust(int low,int high)
{
    int fa=low,left=2*fa;
    while(left<=high){
        if(left+1<=high && data[left+1]>data[left])
            left=left+1;
        if(data[fa]<data[left]){
            swap(data[fa],data[left]);
            fa=left;
            left=2*fa;
        }else{
            break;
        }
    }
}

void heapSort()
{
    //make heap
    for(int i=n/2;i>=1;i--)
        downAdjust(i,n);
    //sort and adjust
    bool breakHere=false;
    for(int i=n;i>1;i--){
        if(breakHere) break;
        if(data==temp){
            flag=1;
            breakHere=true;
        }
        swap(data[1],data[i]);
        downAdjust(1,i-1);
    }
}

void insertSort()
{
    bool breakHere=false;
    for(int i=2;i<=n;i++){
        //如果判断语句放在这里就错啦。放在这里比较的话,会和原始序列进行一次比较。
     //而题目中说了,适合某次迭代后的序列进行比较。所以审题千万要仔细。 //if(breakHere) break; //if(data==temp){ // flag=0; // breakHere=true; //} int k=i,tmp=data[i]; while(k>1 && data[k-1]>tmp){ data[k]=data[k-1]; k--; } data[k]=tmp; if(breakHere) break; if(data==temp){ flag=0; breakHere=true; } } } int main() { //freopen("pat.txt","r",stdin); scanf("%d",&n); ori.resize(n+1); temp.resize(n+1); for(int i=1;i<=n;i++) scanf("%d",&ori[i]); for(int i=1;i<=n;i++) scanf("%d",&temp[i]); data=ori; heapSort(); if(flag==1){ printf("Heap Sort "); for(int i=1;i<data.size();i++){ printf("%d",data[i]); if(i<data.size()-1) printf(" "); else printf(" "); } }else { data=ori; insertSort(); printf("Insertion Sort "); for(int i=1;i<data.size();i++){ printf("%d",data[i]); if(i<data.size()-1) printf(" "); else printf(" "); } } return 0; }

 


以上是关于1098 Insertion or Heap Sort的主要内容,如果未能解决你的问题,请参考以下文章

1098 Insertion or Heap Sort (25 分)

PAT 1098 Insertion or Heap Sort (25)

PAT_A1098#Insertion or Heap Sort

1098. Insertion or Heap Sort (25)排序——PAT (Advanced Level) Practise

1098 Insertion or Heap Sort (25分)(堆排序和插入排序)

1098 Insertion or Heap Sort