一、思路
使用sort()模拟归并排序和插入排序的执行过程;
插入排序模拟:第i轮排序后,前i个元素有序,其余元素位置顺序不改变。
sort( ans.begin(), ans.begin() + i );//第i轮
归并排序模拟:第i轮,每2^i个元素为一块,块内有序。
for( int j = 0; j < N; j += i )//第i轮
sort( ans.begin() + j, ans.begin() + min( N, i + j ) );
测试点2答案错误:插入排序初始增量设置问题
二、代码
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N, flag = 0;
scanf("%d", &N);
vector<int> a1(N), ans(N), a2(N);
for( int i = 0; i < N; ++i )
scanf("%d", &a1[i]);
for( int i = 0; i < N; ++i )
scanf("%d", &a2[i]);
ans = a1;
for( int i = 3; i <= N && !flag; ++i )
{
flag = ( ans == a2 );
sort( ans.begin(), ans.begin() + i );
if( flag )
printf("Insertion Sort\n");
}
if( !flag )
ans = a1;
for( int i = 2; i < N * 2 && !flag; i *= 2 )
{
flag = ( ans == a2 );
for( int j = 0; j < N; j += i )
sort( ans.begin() + j, ans.begin() + min( N, i + j ) );
if( flag )
printf("Merge Sort\n");
}
for( int i = 0; i < N; ++i )
printf("%s%d", i ? " ":"", ans[i]);
}