题目描述:
根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入描述:
输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以
空格分隔。
输出描述:
首先在第1行中输出“Insertion Sort”表示插入排序、“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。
输入例子:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
输出例子:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
代码:
#include <algorithm>
#include <iostream>
using namespace std;
int n,a[110],s[110];
void mergesort(int (&a)[110],int s[],int n){ //注意引用数组的写法
int step=1,flag=1;
while(flag){ //flag表示数组的中间步骤是否与中间数组相同
flag=0;
for(int i=0;i<n;i++){
if(a[i]!=s[i])
flag=1;
}
step*=2; //不断的归并排序,直到与中间数组相同,再排序一次并退出
for(int i=0;i<n;i+=step)
sort(a+i,a+min(i+step,n)); //不像插入排序一样只用一次处理。是因为判断归并的有序 区间大小比较复杂
}
}
int main(){
int i,j;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++)
cin>>s[i];
for (i = 0; i < n - 1 && s[i] <= s[i + 1]; i++); //找出有序和无序的分界点
for (j = i + 1; a[j] == s[j] && j < n; j++); //判断后面是不是和插入排序未排序的序列相同
if(j==n){
cout<<"Insertion Sort"<<'\n';
sort(a,a+i+2); //直接用sort函数代替插入排序(注意下标)
}
else{
cout<<"Merge Sort"<<'\n';
mergesort(a,s,n);
}
for(int i=0;i<n;i++){
cout<<a[i];
if(i!=n-1) cout<<" ";
}
return 0;
}