题意:给出两组数,第一组数为原始序列,第二组数为经过若干次插入排序或堆排序后的序列,判定到底是属于哪一种排序的结果,然后输出以这种排序的下一次迭代后的序列。
思路:就是练习插入排序和堆排序,没什么好说的。不过有一个小细节,我被扣了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\n"); for(int i=1;i<data.size();i++){ printf("%d",data[i]); if(i<data.size()-1) printf(" "); else printf("\n"); } }else { data=ori; insertSort(); printf("Insertion Sort\n"); for(int i=1;i<data.size();i++){ printf("%d",data[i]); if(i<data.size()-1) printf(" "); else printf("\n"); } } return 0; }
原文地址:https://www.cnblogs.com/kkmjy/p/9597173.html
时间: 2024-11-07 13:48:07