PAT 1035. 插入与归并(25)

时间:2023-11-23 19:57:20

根据*的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:

输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:

首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。

输入样例1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

输出样例1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

输入样例2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

输出样例2:

Merge Sort
1 2 3 8 4 5 7 9 0 6

考察插入排序与归并排序,需注意的是,此处考察的是归并排序的自底向上的方法而非递归形式的自顶向下。
 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
//交换元素
void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
//打印数组
void print(int a[],int n){
printf("%d",a[]);
for(int i=;i<n;i++){
printf(" %d",a[i]);
}
printf("\n");
} //归并排序中的合并操作
void merge(int a[],int start,int mid,int end){
int c[];
int start1 = mid+;
int k = ;
int h = start;
while(start<=mid&&start1<=end){
if(a[start]<a[start1])
c[k++] = a[start++];
else
c[k++] = a[start1++];
}
while(start<=mid)
c[k++] = a[start++];
while(start1<=end)
c[k++] = a[start1++];
for(int i=;i<k;i++)
a[i+h] = c[i]; }
//归并排序中自顶向下的递归形式
/*void mergeSort(int a[],int start,int end){
if(start<end){
int mid = (start+end)/2;
mergeSort(a,start,mid);
mergeSort(a,mid+1,end);
merge(a,start,mid,end);
print(a,10);
}
}*/ //归并排序中自底向下的形式
void mergeSort(int a[],int length,int n){
int i;
for(i=;i+*length-<n;i=i+length*)
merge(a,i,i+length-,i+*length-);
if(i+length-<n)
merge(a,i,i+length-,n);
} int main(){
int n;
int a[];
int a1[];
int b[];
int j;
int flag=,flag1=;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&a[i]);
a1[i] = a[i];
}
for(int i=;i<n;i++){
scanf("%d",&b[i]);
}
//插入排序
for(int i=;i<n;i++){
for(j=i;j>;j--){
if(a[j]<a[j-]){
swap(a[j],a[j-]);
}
}
if(flag){
printf("Insertion Sort\n");
print(a,n);
return ;
}
for(j=;j<n;j++){
if(a[j]!=b[j]){
break;
}
}
if(j==n){
flag = ;
}
}
//归并排序
int length;
for(length=;length<n;length=length*){
mergeSort(a1,length,n-);
if(flag1){
printf("Merge Sort\n");
print(a1,n);
return ;
}
for(j=;j<n;j++){
if(a1[j]!=b[j])
break;
}
if(j==n)
flag1 = ;
} }