1089 Insert or Merge (25 分)
题目大意
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法是插入算法还是归并算法。首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。
基本思路
思路借鉴柳神,链接如下: 添加链接描述 先将ii指向中间序列中满足从左到右从小到大顺序的最后一个下标,再将jj指向从i+1开始第一个不满足a[jj]==b[jj]的下标,如果jj顺利到达了n,说明是插入排序,下一次迭代的序列是sort(a,a+ii+2);否则说明是归并排序,让序列a模拟归并排序的过程,当 当前序列和序列b相同时停止,再进行一次归并排序。输出中间序列下一次迭代后的序列。
代码
具体数据结构和详细思路的设计请看代码注释:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int a[100],b[100];
int ii,jj;
int main(){
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int j=0;j<n;j++) cin>>b[j];
for(ii=0;ii<n-1&&b[ii]<=b[ii+1];ii++);
for(jj=ii+1;jj<n&&a[jj]==b[jj];jj++);
if(jj==n){
cout<<"Insertion Sort"<<endl;
sort(b,b+ii+2);
for(int i=0;i<n;i++){
if(i!=0) cout<<" ";
cout<<b[i];
}
}else{
cout<<"Merge Sort"<<endl;
int k=1;
int flag=1;
while(flag){
flag=0;
for(int i=0;i<n;i++){
if(a[i]!=b[i]){
flag=1;
break;
}
}
k=k*2;
for(int i=0;i<n/k;i++){
sort(a+k*i,a+k*(i+1));
}
sort(a+(n/k)*k,a+n);
}
for(int i=0;i<n;i++){
if(i!=0) cout<<" ";
cout<<a[i];
}
}
}
|