!!!注意一下如果边界条件设置不好sort会越界
自己做的时候用了一种讨巧的办法来区分merge和insert,根本用不到原始序列
merge每一对元素都有序,所以从头往后看每一对如果都有序就是merge,否则是insert
insert没啥可说的,直接sort就行
merge要用到原始序列(本来以为能不用原始序列结果发现麻烦死)
用vector做容器能直接用==比较两个序列是否相等,省的写比较函数了
代码如下:
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
vector<int>init_data,now_data;
int n;
void output()
{
for(int i=0;i<now_data.size();i++)
{
printf("%d",now_data[i]);
if(i==now_data.size()-1)
printf("\n");
else
printf(" ");
}
}
bool is_merge()
{
for(int i=0;i<now_data.size();i+=2)
{
if(i==now_data.size()-1)
return true;
else if(now_data[i]>now_data[i+1])
return false;
}
return true;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int temp;
scanf("%d",&temp);
init_data.push_back(temp);
}
for(int i=0;i<n;i++)
{
int temp;
scanf("%d",&temp);
now_data.push_back(temp);
}
if(is_merge())
{
int flag=0;
for(int step=2;;step*=2)
{
for(int i=0;i<init_data.size();i+=step)
{
sort(init_data.begin()+i,min(init_data.begin()+i+step,init_data.end()));
}
if(flag==1)
break;
if(init_data==now_data)
flag=1;
}
now_data=init_data;
printf("Merge Sort\n");
}
else{
int index;
for(index=1;index<now_data.size();index++)
{
if(now_data[index]<now_data[index-1])
break;
}
sort(now_data.begin(),now_data.begin()+index+1);
printf("Insertion Sort\n");
}
output();
return 0;
}