22分的代码:
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int maxn=110;
int a[maxn];
int b[maxn];
void print(int a[],int n){
for(int i=0;i<n;i++){
printf("%d",a[i]);
if(i!=n-1) printf(" ");
}
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
cin>>b[i];
}
int i=0,j=n-1;
while(b[i]<=b[i+1])i++;
while(a[j]==b[j] && j>i) j--;
if(i==j){
cout<<"Insertion Sort"<<endl;
int k;
for(k=0;k<j;k++){
if(b[j+1]<b[k])break;
}
int t=b[j+1];
for(int s=j+1;s>k;s--){
b[s]=b[s-1];
}
b[k]=t;
print(b,n);
}else{
cout<<"Merge Sort"<<endl;
int flag=0;
for(int st=2;st/2<=n;st*=2){
for(int i=0;i<n;i+=st){
for(int k=i+1;k<st && k<n;k++){
if(b[k]<b[k-1]){
flag=1;break;
}
}
if(flag)break;
}
if(flag){
for(int i=0;i<n;i+=st){
sort(b+i,b+min(n,st+i));
}
break;
}
}
print(b,n);
}
return 0;
}
正确答案:
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int N=111;
int origin[N],tmp[N],change[N];
int n;
void print(int a[],int n){
for(int i=0;i<n;i++){
printf("%d",a[i]);
if(i!=n-1) printf(" ");
}
}
bool isSame(int A[],int B[]){
for(int i=0;i<n;i++){
if(A[i]!=B[i])return false;
}
return true;
}
bool insertSort(){
bool flag=false;
for(int i=1;i<n;i++){
if(i!=1 && isSame(tmp,change)){
flag=true;
}
int t=tmp[i],j=i;
while(j>0 && tmp[j-1]>t){
tmp[j]=tmp[j-1];
j--;
}
tmp[j]=t;
if(flag)return true;
}
return false;
}
void mergeSort(){
bool flag=false;
for(int s=2;s/2<=n;s*=2){
if(s!=2&&isSame(tmp,change)) flag=true;
for(int i=0;i<n;i+=s) sort(tmp+i,tmp+min(n,i+s));
if(flag){
print(tmp,n);
return;
}
}
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&origin[i]);
tmp[i]=origin[i];
}
for(int i=0;i<n;i++){
scanf("%d",&change[i]);
}
if(insertSort()){
printf("Insertion Sort\n");
print(tmp,n);
}else{
printf("Merge Sort\n");
for(int i=0;i<n;i++){
tmp[i]=origin[i];
}
mergeSort();
}
return 0;
}