这道题考察的是插入排序和归并排序的实现,首先要做的就是判断使用的是插入排序还是归并排序,我用的方法是:遍历第二个数组,找到第一个不是增序的元素(也就是小于前一个元素的元素),然后从这个元素开始遍历后边的数组,判断当前元素是否与原数组中相同位置的元素相等,若在遍历结束之前出现了不相等,则就是归并排序,否则是插入排序,因为插入排序每次将一个元素放到该放的位置,所以无序的元素和原数组相同。
接下来是在进行一次排序,插入排序很好说,将第一个无序的元素插入到前边有序数列中去就行,而归并排序还有模拟一下判断现在一个归并段的长度是多少,从归并段长度k=1开始模拟,直到和第二个数组完全相同,则下一次的k就是2*k,将第二个数组在进行一次归并即可。
#include <algorithm>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
string str1="Insertion Sort";
string str2="Merge Sort";
int main(){
int N;
cin>>N;
int N1[N],N2[N];
for(int i=0;i<N;i++){
cin>>N1[i];
}
for(int i=0;i<N;i++){
cin>>N2[i];
}
int j=0;
while(j<N-1){ //找到第一个无序的元素
if(N2[j]<=N2[j+1]){
j++;
}
else{
break;
}
}
j++;
int temp=j;
while(j<N){ //判断后面的元素是否都想同
if(N1[j]==N2[j]){
j++;
}
else{
break;
}
}
if(j==N){ //都相同则为插入排序
cout<<str1<<"\n";
int temp1=N2[temp];
while(N2[temp-1]>temp1&&temp>0&&temp<N){ //在进行一次插入
N2[temp]=N2[temp-1];
temp--;
}
N2[temp]=temp1;
}
else {
cout<<str2<<"\n";
int k=1,flag=1;
while(flag){
flag=0;
for(int i=0;i<N;i++){ //判断现在的归并段长度是多少
if(N1[i]!=N2[i]){
flag=1;
break;
}
}
k*=2;
if(flag==1){
for(int i=0;i<N/k;i++){
sort(N1+i*k,N1+(i+1)*k);
}
sort(N1+N/k*k,N1+N);
}
else{ //找到归并段长度后,对第二个数组进行一次归并
for(int i=0;i<N/k;i++){
sort(N2+i*k,N2+(i+1)*k);
}
sort(N2+N/k*k,N2+N);
}
}
}
for(int i=0;i<N-1;i++){
cout<<N2[i]<<" ";
}
cout<<N2[N-1];
return 0;
}