0
点赞
收藏
分享

微信扫一扫

1098 Insertion or Heap Sort (25 分)

杨小羊_ba17 2022-03-11 阅读 79

1098 Insertion or Heap Sort (25 分)

题意

给出两组数列s1和s2,分别为初始序列和经过部分排序后的序列。要求你判断使用的是插入排序还是堆排序。并输出下一步排序的序列。

思路

先判断是否是插入排序,不是插入排序就是堆排序。
在对数列进行堆排序(大根堆),找到后一步的序列。
注意:要求输出下一步的序列一定是和s2不同,s1和s2可能会相同。

代码

#include<stdio.h>
#include<algorithm>

using namespace std;

int init[100007],fina[100007],x[100007];

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

bool Insert(int n)
{
	int temp,y,flag=0;
	for(int i=0;i<n;i++){
		x[i]=init[i];
	}
	for(int i=1;i<n;i++){
		temp=0;
		y=x[i];
		for(int j=i-1;j>=0;j--){
			if(x[i]>=x[j]){
				temp=j+1;
				break;
			}
		}
		for(int j=i-1;j>=temp;j--){
			x[j+1]=x[j];
		}
		x[temp]=y;
		if(temp==i&&flag==2){
			continue;
		}
		if(flag==2){
			for(int j=0;j<n;j++){
				if(j!=0){
					printf(" ");
				}
				printf("%d",x[j]);
			}
			return true;
		}
		flag=0;
		for(int j=0;j<n;j++){
			if(fina[j]!=x[j]){
				flag=1;
				break;
			}
		}
		if(flag==0){
			printf("Insertion Sort\n");
			flag=2;
		}
	}
	return false;
}

void Heap(int n)
{
	int flag=0,confirm=0,a;
	for(int i=0;i<n;i++){
		x[i+1]=init[i];
	}
	int s=n/2;
	for(int i=s;i>=1;i--){
		downAdjust(i,n);
	}
	for(int i=1;i<=n;i++){
		a=x[1];
		x[1]=x[n-i+1];
		x[n-i+1]=a;
		downAdjust(1,n-i);
		flag=0;
		for(int j=0;j<n;j++){
			if(x[j+1]!=fina[j]){
				flag=1;
				break;
			}
		}
		if(confirm==1&&flag==1){
			for(int j=1;j<=n;j++){
				if(j!=1){
					printf(" ");
				}
				printf("%d",x[j]);
			}
			return;
		}
		if(flag==0){
			printf("Heap Sort\n");
			confirm=1;
		}
	}
}

int main()
{
	int n;
	 scanf("%d",&n);
	 for(int i=0;i<n;i++){
	 	scanf("%d",&init[i]);
	 }
	 for(int i=0;i<n;i++){
	 	scanf("%d",&fina[i]);
	 }
	 if(!Insert(n)){
	 	Heap(n);
	 }
	 return 0;
} 
举报

相关推荐

0 条评论