1035 插入与归并 (25分)
- 数据比较小,归并不用写合并函数,直接sort
- 中间序列不包括初始序列
#include<iostream>
#include<vector>
#include<cctype>
#include<map>
#include<set>
#include<sstream>
#include<string>
#include<cstdio>
#include<algorithm>
#define inf 0x3f3f3f3f
const int maxn=111;
typedef long long ll;
using namespace std;
int origin[maxn],tempOri[maxn],changed[maxn];//原始数组,原始数组备份,目标数组
int n;
bool isSame(int A[],int B[]){
for(int i=0;i<n;i++){
if(A[i]!=B[i]) return false;
}
return true;
}
bool showArray(int A[]){
for(int i=0;i<n;i++){
printf("%d",A[i]);
if(i<n-1) cout<<" ";
}
cout<<"\n";
}
bool insertSort(){
bool flag=false;
for(int i=1;i<n;i++){
if(i!=1&&isSame(tempOri,changed)){
flag=true;
}
int temp=tempOri[i],j=i;
while(j>0&&tempOri[j-1]>temp){
tempOri[j]=tempOri[j-1];
j--;
}
tempOri[j]=temp;
if(flag==true){
return true;
}
}
return false;
}
void mergeSort(){
bool flag=false;
for(int step=2;step/2<=n;step*=2){
if(step!=2&&isSame(tempOri,changed)){
flag=true;
}
for(int i=0;i<n;i+=step)
sort(tempOri+i,tempOri+min(i+step,n));
if(flag){
showArray(tempOri);
return ;
}
}
}
int main() {
cin>>n;
for(int i=0;i<n;i++){
cin>>origin[i];
tempOri[i]=origin[i];
}
for(int i=0;i<n;i++){
cin>>changed[i];
}
if(insertSort()){
cout<<"Insertion Sort\n";
showArray(tempOri);
}else{
cout<<"Merge Sort\n";
for(int i=0;i<n;i++){
tempOri[i]=origin[i];
}
mergeSort();
}
return 0;
}