首先要说明的是,这题题目出错了,而我以为是我犯的错误,测试了几个小时都没有AC,我觉得我的时间真的白白浪费了。
有一个测点是
10
3 1 2 8 7 5 9 4 6 0
1 2 3 5 7 8 9 4 6 0
题目对应输出应该为:
Insertion Sort
1 2 3 4 5 7 8 9 6 0
但是,这题在连续两次的迭代过程中都是1 2 3 5 7 8 9 4 6 0,在5插入完成和9插入完成之后都是上述结果,因此,下一步迭代是有两种可能的,而题目说It is guaranteed that the answer is unique for each test case. 而且题目对插入排序的定义就是每个元素的插入代表一次迭代,并不是说中间结果有改变才叫一次迭代。难道是我英语不好???
真是意想不到,读了十几遍我的代码就是找不出错误,因为我太相信题目说的话了。后来,在牛客网上找到了这个出错的用例。
下面贴上能够AC的代码
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int N;
int insert[100];
int merge[100];
int ans[100];
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
scanf("%d", &insert[i]);
merge[i] = insert[i];
}
for (int i = 0; i < N; i++)
{
scanf("%d", &ans[i]);
}
int i, j;
bool isInsert = false;
for (i = 1; i < N; i++)
{
int tmp = insert[i];
for (int k = i - 1; k >= 0; k--)
{
if (tmp < insert[k])
{
insert[k + 1] = insert[k];
insert[k] = tmp;
}
else
{
break;
}
}
bool isEqual = true;
for (int k = 0; k < N; k++)
{
if (insert[k] != ans[k])
{
isEqual = false;
break;
}
}
if (isInsert && !isEqual)
{
printf("Insertion Sort\n%d", insert[0]);
for (int m = 1; m < N; m++)
{
printf(" %d", insert[m]);
}
break;
}
if (isEqual && i != N)
{
isInsert = true;
}
}
if (!isInsert)
{
bool isMerge = false;
for (j = 2;; j *= 2)
{
if (j > N)
{
break;
}
int k;
for (k = 0; k + j < N - 1; k += j)
{
sort(merge + k, merge + k + j);
}
sort(merge + k, merge + N);
if (isMerge)
{
printf("Merge Sort\n%d", merge[0]);
for (k = 1; k < N; k++)
{
printf(" %d", merge[k]);
}
break;
}
for (k = 0; k < N; k++)
{
if (merge[k] != ans[k])
{
break;
}
}
if (k == N&&j != N)
{
isMerge = true;
}
}
}
system("pause");
return 0;
}