思路:先判断是不是插入排序,不是的话模拟归并排序,但是这数据真的太坑。对于原始序列和中间序列都是2,3,4,1的测试点,需要得到1,2,3,4。严格来说这个中间序列根本就没法判断到那一步了,各位小心
#include<bits/stdc++.h>
using namespace std;
int before[102],after[102],T[102];
int n;
bool is_sort(int m){
for(int i=0;i<m-1;i++){
if(after[i]>after[i+1]){
return false;
}
}
return true;
}
void input(){
cin>>n;
for(int i=0;i<n;i++){
cin>>before[i];
}
for(int i=0;i<n;i++){
cin>>after[i];
}
}
void print(){
if(n){
printf("%d",after[0]);
for(int i=1;i<n;i++){
printf(" %d",after[i]);
}
printf("\n");
}
}
void insert_sort(int m){
//坑爹的测试点2
for(int i=m;i<n;i++){
if(after[i]<after[i-1]){
m=i;
break;
}
}
int temp=after[m];
bool flag=true;
for(int i=m-1;i>=0;i--){
if(after[i]>temp){
after[i+1]=after[i];
}else{
after[i+1]=temp;
flag=false;
break;
}
}
if(flag){
after[0]=temp;
}
}
void merge_sort(){
int pre=-1,flag=1;
int seg=n;
//获取当前中间序列归并的段长度
for(int i=0;i<n;i++){
if(flag){
pre=i;
flag=0;
}else{
if(after[i]<after[i-1]){
if(i!=n-1){
if(i-pre==1){
seg=1;
break;
}
seg=min(seg,i-pre);
pre=i;
}
}
}
}
seg<<=1;
int t=0;
//纯手动模拟的归并排序
for(int i=0;i<n/seg;i++){
int L1=i*seg,L2=i*seg+seg/2,R1=L2,R2=L2+seg/2;
while(L1<R1||L2<R2){
if(L1>=R1||(L2<R2&&after[L2]<after[L1])){
T[t++]=after[L2++];
}else{
T[t++]=after[L1++];
}
}
}
if(n%seg<=seg/2){
for(int i=t;i<n;i++){
T[i]=after[i];
}
}else{
int L1=t,L2=L1+seg/2,R1=L2,R2=n;
while(L1<R1||L2<R2){
if(L1>=R1||(L2<R2&&after[L2]<after[L1])){
T[t++]=after[L2++];
}else{
T[t++]=after[L1++];
}
}
}
for(int i=0;i<n;i++){
after[i]=T[i];
}
/*
bool flag=true;
int k=1;
while(flag) {
flag=false;
for(int i=0;i<n;i++) {
if(before[i]!=after[i])
flag=true;
}
k<<=1;
for(int i=0;i<n/k;i++){
sort(before+i*k,before+(i+1)*k);
}
sort(before+n/k*k,before+n);
}
for(int i=0;i<n;i++){
after[i]=before[i];
}
*/
}
void solve(){
if(is_sort(n)){
if(n){
printf("Insertion Sort\n");
}
print();
return;
}
int pos=0;
for(int i=n-1;i>=0;i--){
if(before[i]!=after[i]){
pos=i;
break;
}
}
if(is_sort(pos+1)){
printf("Insertion Sort\n");
insert_sort(pos+1);
print();
}else{
printf("Merge Sort\n");
merge_sort();
print();
}
}
int main(){
//freopen("in.txt","r",stdin);
input();
solve();
return 0;
}