根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入格式:
输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。
输出格式:
首先在第 1 行中输出Insertion Sort
表示插入排序、或Merge Sort
表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。
#include<stdio.h>
int main(){
int N;
scanf("%d",&N);
int chushi1[1000];
int chushi2[1000];
int zhongjian[1000];
int i;
for(i=1;i<=N;i++){
scanf("%d",&chushi1[i]);
}
for(i=1;i<=N;i++){
scanf("%d",&zhongjian[i]);
}
for(i=1;i<=N;i++){
chushi2[i] = chushi1[i];
}
int flag1,flag2;
flag1=flag2=0;
int m1 = 1;
int m2 = 2;
while(flag1==0&&flag2==0){
insertSort(chushi1,m1);
mergeSort(chushi2,m2,N);
m1++;
m2*=2;
flag1=check(chushi1,zhongjian,N);
flag2=check(chushi2,zhongjian,N);
}
if(flag1){
insertSort(chushi1,m1);
printf("Insertion Sort\n");
printnext(chushi1,N);
}else{
mergeSort(chushi2,m2,N);
printf("Merge Sort\n");
printnext(chushi2,N);
}
}
void insertSort(int *a,int m){
int i = m+1;
int j = m;
a[0] = a[m+1];
for(j;a[j]>a[0];j--){
a[j+1] = a[j];
}
a[j+1] = a[0];
}
void mergeSort(int *a,int m,int n){
int i = 0;
int j;
int k;
int t;
int b[1000];
for(i=1;i<=n;i+=m){
j=i;k=i+m/2;
t=i;
while(j<i+m/2&&k<i+m&&j<=n&&k<=n){
if(a[j]>=a[k]){
b[t] = a[k];
k++;
t++;
}else if(a[j]<a[k]){
b[t] =a[j];
t++;
j++;
}
}
if(j>=i+m/2){
while(k<i+m&&k<=n){
b[t] = a[k];
t++;
k++;
}
}else{
while(j<i+m/2&&j<=n){
b[t] =a[j];
t++;
j++;
}
}
}
for(i=1;i<=n;i++){
a[i] = b[i];
}
}
int check(int *a,int *b,int n){
int i;
int flag = 1;
for(i=1;i<=n;i++){
if(a[i]!=b[i])flag=0;
}
return flag;
}
void printnext(int *a,int n){
int i;
for(i=1;i<=n;i++){
printf("%d",a[i]);
if(i!=n)printf(" ");
}
}