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