一、题目描述
Input Specification:
Output Specification:
Sample Input 1:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
Sample Output 1:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
Sample Input 2:
10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6
Sample Output 2:
Merge Sort
1 2 3 8 4 5 7 9 0 6
二、解题思路
给出一个序列和经过若干步排序的序列,要求我们指出排序方式是插入排序还是归并排序,这道题我是直接模拟了两个排序的第n轮,对序列中的数一个一个进行比较,事实上这样做还是比较低效的,建议看看柳神的代码,非常巧妙。
三、AC代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> origin, sorted1, sorted2 ,check;
bool insertion_sort(int round) //插入排序的第round次
{
for(int i=round; i>0; i--) //第一次
{
if(sorted1[i] < sorted1[i-1]) swap(sorted1[i], sorted1[i-1]);
else break;
}
int sze = origin.size();
for(int i=0; i<sze; i++)
{
if(check[i] != sorted1[i])
return false;
}
return true;
}
bool merge_sort(int round) //归并排序的第round次
{
int sze = origin.size(), mk=1;
for(int i=0; i<round; i++)
mk = mk*2;
for(int i=0; i<sze; )
{
if(i+mk > sze) mk = sze-i;
sort(sorted2.begin()+i, sorted2.begin()+i+mk);
i += mk;
}
for(int i=0; i<sze; i++)
{
if(check[i] != sorted2[i])
return false;
}
return true;
}
void printV(vector<int>& v)
{
int sze = v.size();
for(int i=0; i<sze; i++)
{
if(i == 0) printf("%d", v[i]);
else printf(" %d", v[i]);
}
return;
}
int main()
{
int N, tmp;
scanf("%d", &N);
for(int i=0; i<N; i++)
{
scanf("%d", &tmp);
origin.push_back(tmp);
sorted1.push_back(tmp);
sorted2.push_back(tmp);
}
for(int i=0; i<N; i++)
{
scanf("%d", &tmp);
check.push_back(tmp);
}
int i=1, sze, mk=0;
while(i < N)
{
if(insertion_sort(i))
{
printf("Insertion Sort\n");
insertion_sort(i+1);
mk = 1;
break;
}
if(merge_sort(i))
{
printf("Merge Sort\n");
merge_sort(i+1);
mk = 2;
break;
}
i++;
}
if(mk == 1) printV(sorted1);
else printV(sorted2);
return 0;
}