PAT (Basic Level) Practise (中文)-1035. 插入与归并(25)

时间:2023-03-09 03:18:35
PAT (Basic Level) Practise (中文)-1035. 插入与归并(25)

PAT (Basic Level) Practise (中文)-1035. 插入与归并(25)   http://www.patest.cn/contests/pat-b-practise/1035

根据*的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:

输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:

首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。

输入样例1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

输出样例1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

输入样例2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

输出样例2:

Merge Sort
1 2 3 8 4 5 7 9 0 6 此题的一大坑儿是:定义的边界理解-需要很严肃地抠词儿,哈哈哈哈哈。。。先看定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?  分析:插入排序:将当前处理的元素‘插入’到前一步的‘有序’序列中-》如果要插入的有序子序列的元素个数为0,则并不叫插入,所以i=0不满足-》所以,要从i=1开始,因为第0个元素就是一个有序子序列。
‘中间’序列:先处理,再匹配。

当时被插入排序的‘i=0’和'i=1'在定义上的区别坑得死去活来。。。

 #include<cstdio>

 void Insertion(int *num,int k,int len)
{
if(k>=len) k=len-;
int temp=num[k];
for(int i=k-;i>=;i--)
{
if(num[i]>temp) num[i+]=num[i],num[i]=temp;
else
break;
}
} void Merge(int *num,int k,int len)
{
if(k>=len) k=len;
int start=,end=;
for(int i=;i<len;)
{
start=i;
end=(start+k>len?len:start+k);
for(int m=end-;m>=start;m--)
{
int iloc=-,max=num[start],l=;
for(l=start;l<=m;l++) if(num[l]>=max) iloc=l,max=num[l];
if(iloc>=) num[iloc]=num[l-],num[l-]=max;
}
i+=k;
}
} int match(int *num0,int *num3,int len)
{
for(int i=;i<len;i++)
if(num0[i]!=num3[i]) return ;
return ;
} int main()
{
int n=;
int num[]={}; // 原数据
int num0[]={}; // 处理后
int num1[]={}; scanf("%d",&n);
for(int i=;i<n;i++) scanf("%d",&num[i]);
for(int i=;i<n;i++) scanf("%d",&num0[i]); for(int i=;i<n;i++) num1[i]=num[i];
for(int i=;i<n;i++)
{
Insertion(num1,i,n);
if(match(num0,num1,n))
{
printf("Insertion Sort\n");
Insertion(num1,i+,n);
for(int j=;j<n;j++)
{
if(j==n-) printf("%d",num1[j]);
else printf("%d ",num1[j]);
}
return ;
}
} for(int i=;i<n;i++) num1[i]=num[i];
for(int i=;;)
{
Merge(num1,i,n);
if(match(num0,num1,n))
{
printf("Merge Sort\n");
Merge(num1,i*,n);
for(int j=;j<n;j++)
{
if(j==n-) printf("%d",num1[j]);
else printf("%d ",num1[j]);
}
return ;
}
i*=;
if(i>*n) break;
} return ;
}