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;
}