根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成 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 <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
//插入排序
int insertSort(int arr[], int i)//一次插入排序,i逐一增大
{
int temp = arr[i];
int j = i - 1;
if(temp<arr[j])
while(temp < arr[j])
{
arr[j+1] = arr[j];
j--;
if(j == -1)
{
break;
}
}
arr[j+1] = temp;
}
//归并排序
void MergeSort(int k[],int n,int i)//一次迭代归并排序,i乘2增加
{
int next,left_min,left_max,right_min,right_max;
int *temp = (int *)malloc(n * sizeof(int));
for(left_min=0; left_min<n-i; left_min = right_max)
{
right_min = left_max = left_min + i;
right_max = left_max + i;
if(right_max>n)
{
right_max = n;
}
next = 0;
while(left_min<left_max&&right_min<right_max)
{
if(k[left_min] < k[right_min])
{
temp[next++] = k[left_min++];
}
else
{
temp[next++] = k[right_min++];
}
}
while(left_min < left_max)
{
k[--right_min] = k[--left_max];
}
while(next>0)
{
k[--right_min] = temp[--next];
}
}
}
//判断两个数组是否相等
int Compare(int arr1[],int arr2[],int length)
{
int flag=0;
for(int i=0;i<length;i++)
{
if(arr1[i]==arr2[i]) continue;
else {flag=1;break;}
}
return flag;//flag=0表示相等;flag=1表示不等
}
int main()
{
int N,flag_insert=0,flag_merge=0;
string A="Insertion Sort",B="Merge Sort";
cin >> N;
int first1[N],first2[N],second[N];
for (int i=0;i<N;i++)
{
cin >> first1[i];//原始序列
first2[i]=first1[i];
}
for (int i=0;i<N;i++)
cin >> second[i];//中间序列
int n1=1,n2=1;
do
{
flag_insert=0;
flag_merge=0;
insertSort(first1,n1);
n1++;
MergeSort(first2,N,n2);
n2*=2;
flag_insert=Compare(first1,second,N);//比较一轮插入排序迭代后的数组
flag_merge=Compare(first2,second,N);//比较一轮归并排序迭代后的数组
}while(flag_insert==1 && flag_merge==1);
if(flag_insert==0)
{
cout << A << endl ;
int num;
for(int i=n1;i<N;i++)
{
if(first1[i-1]>first1[i]) { num=i;break;}//找到不符合升序的数,从该数开始
else num=n1;
}
insertSort(second,num);
}
if(flag_merge==0)
{
cout << B << endl ;
MergeSort(second,N,n2);
}
for(int i=0;i<N;i++)
{
if(i<N-1) cout << second[i] << ' ';
else cout << second[i];
}
return 0;
}