PAT-堆-1098 Insertion or Heap Sort

44 阅读1分钟

思路

  • 先对初始序列a一步一步对比插入排序,如果是插入排序,继续迭代一次并输出。
  • 不是插入,对序列b用堆的向下调整即可。

反思

  • 可以用vector存储a,b。可以直接比较,并可以把vector作为堆向下调整的参数。
  • 除了可以继续迭代一次得到结果,也可以使用sort(a,a+i)。

代码

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> a,b;
int n;

void downAdujust(int low,int high,vector<int> &a){
	int i=low,j=2*i;
	while(j<=high){
		if(j+1<=high&&a[j]<a[j+1]) j++;
		if(a[j]<=a[i]) break;
		int temp=a[i];
		a[i]=a[j];
		a[j]=temp;
		i=j;
		j=2*i;
	}
}


int main(){
	scanf("%d",&n);
	int x;
	a.push_back(0);
	b.push_back(0);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		a.push_back(x);
	}
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		b.push_back(x);
	}
	int i;
	int flag=0;
	for(i=2;i<=n;i++){
		int temp=a[i];
		int j=i;
		while(j>1&&a[j-1]>temp){
			a[j]=a[j-1];
			j--;
		}
		a[j]=temp;
		if(flag==1){
			for(int i=1;i<=n;i++){
				printf("%d",a[i]);
				if(i!=n) printf(" ");
			}
			break; 
		}
		if(a==b){
			printf("Insertion Sort\n");
			flag=1;
		}
	}
	if(flag==0){
		printf("Heap Sort\n");
		int i;
		for(i=2;i<=n;i++){
			if(b[i]>b[1]) break;
		}
		i--;
		swap(b[1],b[i]);
		downAdujust(1,i-1,b);
		for(int i=1;i<=n;i++){
			printf("%d",b[i]);
			if(i!=n) printf(" ");
		}
	}
	return 0;
}