昨天在练习算法的时候,看到了一道有意思的题目:
B1035/A1089.Insert or Merge(25)
1 | 根据维基百科的定义: |
输入格式:
1 | 输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。 |
输出格式:
1 | 首先在第 1 行中输出Insertion Sort表示插入排序、或Merge Sort表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。 |
1 | 输入样例 1: |
1 | 输入样例 2: |
思路
先进行插入排序,如果执行中发现与给定序列吻合,那么说明是插入排序,计算出下一步的序列后结束算法;如果不是插入排序,那么一定是归并排序,模拟归并排序的过程,如果执行过程中发现与给定序列吻合,那么计算出下一步的序列后结束算法。
注意点
初始序列不参与是否与目标序列相同的比较。如果不考虑这一点可能会导致双解。比如下面一组数据:
1 | //input |
优化
这里提供一个比较简单的方法。由于数据范围比较小,在写排序算法的时候可以考虑用sort代替其中比较复杂的部分。
插入排序的特点是,每次插入操作后,数组前i个数一定是有序的,基于这一点,我们可以在写插入排序的时候每次用sort()函数排列前i个数得出插入排序的中间序列,这样就不需要用到复杂的插入操作。
归并排序的特点是,每个步长的数组块一定是有序的,我们可以使用for循环,每次循环i+=step,每次循环用sort()函数直接对步长范围内的数据排序即可得到归并排序的中间序列。
代码
1 |
|