注意点1:判断插入排序不能从头开始判断是否为目标数组,
比如:初始为1 2 3 4 3,目标数组也为1 2 3 4 3,则如果是从头开始推的,则下一步会变成1 2 3 4 3,而下一步应该是 1 2 3 3 4。所以我们应该从第一个无序的位置开始排序。也就是从最后一个3开始排序判断目标数组。
注意点2:题目中的归并排序为相邻归并(递推归并),而非中分归并(递归归并)。
技巧点:排序可以用sort减少思考步骤。
常规模拟版
cpp
#include<bits/stdc++.h>
using namespace std;
int a[110],b[110],c[110];
int n;
bool check(){
for(int i=0;i<n;i++){
if(c[i]!=b[i])return 0;
}
return 1;
}
void print(){
for(int i=0;i<n;i++){
cout<<c[i];
if(i!=n-1)cout<<' ';
}
}
bool insert(){
bool flag=0;
for(int i=1;i<n;i++){
//找到第一个无序的位置排序。
if(c[i-1]<=c[i])continue;
if(check())flag=1;
int pos=i;
int temp=c[i];
while(pos>0&&c[pos-1]>temp){
c[pos]=c[pos-1];
pos--;
}
c[pos]=temp;
if(flag)return 1;
}
return 0;
}
void merge(){
bool flag=0;
for(int len=2;len<=n;len*=2){
if(check())flag=1;
for(int l=0;l<n;l+=len){
int r=min(n-1,l+len-1);
int mid=l+len/2-1;
int i=l,j=mid+1;
vector<int>temp;
while(i<=mid&&j<=r){
if(c[i]<=c[j])temp.push_back(c[i++]);
else temp.push_back(c[j++]);
}
while(i<=mid)temp.push_back(c[i++]);
while(j<=r)temp.push_back(c[j++]);
for(i=l,j=0;i<=r;i++,j++){
c[i]=temp[j];
}
}
if(flag)return ;
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)cin>>b[i];
memcpy(c,a,sizeof a);
if(insert()){
cout<<"Insertion Sort"<<endl;
print();
}else {
memcpy(c,a,sizeof a);
merge();
cout<<"Merge Sort"<<endl;
print();
}
}
sort版
cpp
#include<bits/stdc++.h>
using namespace std;
int a[110],b[110],c[110];
int n;
bool check(){
for(int i=0;i<n;i++){
if(c[i]!=b[i])return 0;
}
return 1;
}
void print(){
for(int i=0;i<n;i++){
cout<<c[i];
if(i!=n-1)cout<<' ';
}
}
bool insert(){
bool flag=0;
for(int i=1;i<n;i++){
//找到第一个无序的位置排序。
if(c[i-1]<=c[i])continue;
if(check())flag=1;
sort(c,c+i+1);
if(flag)return 1;
}
return 0;
}
void merge(){
bool flag=0;
for(int len=2;len<=n;len*=2){
if(check())flag=1;
for(int i=0;i<n;i+=len){
int j=min(n,i+len);
sort(c+i,c+j);
}
if(flag)return ;
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)cin>>b[i];
memcpy(c,a,sizeof a);
if(insert()){
cout<<"Insertion Sort"<<endl;
print();
}else {
memcpy(c,a,sizeof a);
merge();
cout<<"Merge Sort"<<endl;
print();
}
}