判断是否为插入排序较为简单,只需找到第一个违反升序的数,判断从该数开始,其后所有的数是否与原数组一样,是则采用的插入排序,否则采用的归并排序。对于归并排序,关键是找到当前几个元素一组,然后进行下一次归并即可。
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
bool isequal(vector<int>& arr, vector<int>& part, int i){
for(int j = i; j < (int)arr.size(); ++j){
if(arr[j] != part[j]) return false;
}
return true;
}
bool isordered(vector<int>& part, int step){
for(size_t i = 0; i < part.size(); i += step){
for(size_t j = i+1; j < part.size() && j < i+step; ++j){
if(part[j] < part[j-1]) return false;
}
}
return true;
}
int main(){
int n;
scanf("%d", &n);
vector<int> arr(n), part(n);
for(int i = 0; i < n; ++i){
scanf("%d", &arr[i]);
}
for(int i = 0; i < n; ++i){
scanf("%d", &part[i]);
}
size_t x = 1;
for(; x < part.size(); ++x){
if(part[x] < part[x-1]) break;
}
if(isequal(arr, part, x)){
printf("Insertion Sort\n");
sort(part.begin(), part.begin()+x+1);
for(size_t i = 0; i < part.size(); ++i){
if(i) printf(" ");
printf("%d", part[i]);
}
}else{
printf("Merge Sort\n");
int step = 2;
while(isordered(part, step)){
step *= 2;
}
for(size_t i = 0; i < part.size(); i += step){
if(i + step < part.size()){
sort(part.begin()+i, part.begin()+i+step);
}else{
sort(part.begin()+i, part.end());
}
}
for(size_t i = 0; i < part.size(); ++i){
if(i) printf(" ");
printf("%d", part[i]);
}
}
return 0;
}