解题思路:
主要是模拟归并和插入排序的过程,数据量较小,就把归并和插入的过程直接用sort实现了。
注:可以先判断是不是插入排序,如果不是,肯定是归并排序。另外,最初的序列不参与比较。
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 100 + 5;
int inO[maxn], tmpO[maxn], merO[maxn], origin[maxn], n;
bool judge(int a[], int b[])
{
for(int i = 0; i < n; i++)
if(a[i] != b[i]) return false;
return true;
}
void Insertion(int pos)
{
sort(inO, inO+pos);
}
void Merge(int step)
{
for(int i = 0; i < n; i += step)
{
if(i+step < n) sort(merO+i, merO+i+step);
else sort(merO+i, merO+n);
}
}
int main()
{
while(scanf("%d", &n) == 1)
{
for(int i = 0; i < n; i++)
{
scanf("%d", &origin[i]);
inO[i] = origin[i];
merO[i] = origin[i];
}
for(int i = 0; i < n; i++)
scanf("%d", &tmpO[i]);
int flag = 0;
for(int i = 2; i < n; i++)
{
Insertion(i);
if(judge(inO, tmpO)) {flag = 1; Insertion(i+1); break;}
}
if(flag)
{
printf("Insertion Sort\n");
for(int i = 0; i < n; i++)
if(i) printf(" %d", inO[i]);
else printf("%d", inO[i]);
printf("\n");
}
else
{
printf("Merge Sort\n");
for(int i = 2; i < n; i *= 2)
{
Merge(i);
if(judge(merO, tmpO))
{
Merge(i*2);
break;
}
}
for(int i = 0; i < n; i++)
if(i) printf(" %d", merO[i]);
else printf("%d", merO[i]);
printf("\n");
}
}
return 0;
}