1089. Insert or Merge (25)

来源:互联网 发布:淘宝网舞蹈服装上衣 编辑:程序博客网 时间:2024/05/16 13:03
题目:

According to Wikipedia:

Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list, and inserts it there. It repeats until no input elements remain.

Merge sort works as follows: Divide the unsorted list into N sublists, each containing 1 element (a list of 1 element is considered sorted). Then repeatedly merge two adjacent sublists to produce new sorted sublists until there is only 1 sublist remaining.

Now given the initial sequence of integers, together with a sequence which is a result of several iterations of some sorting method, can you tell which sorting method we are using?

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (<=100). Then in the next line, N integers are given as the initial sequence. The last line contains the partially sorted sequence of the N numbers. It is assumed that the target sequence is always ascending. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in the first line either "Insertion Sort" or "Merge Sort" to indicate the method used to obtain the partial result. Then run this method for one more iteration and output in the second line the resulting sequence. It is guaranteed that the answer is unique for each test case. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.

Sample Input 1:
103 1 2 8 7 5 9 4 6 01 2 3 7 8 5 9 4 6 0
Sample Output 1:
Insertion Sort1 2 3 5 7 8 9 4 6 0
Sample Input 2:
103 1 2 8 7 5 9 4 0 61 3 2 8 5 7 4 9 0 6
Sample Output 2:
Merge Sort1 2 3 8 4 5 7 9 0 6
注意:
1、本来应该是一道很简单的题目最后调了这么久自己真是弱爆了啊。
2、这里最重要的是判断是哪种排序方式以及归并排序时的下一次递归的结果。
3、由于判断是否是插入排序的方法比较简单,所以由此来入手,从头开始遍历部分排序的序列,我们知道如果是插入排序的话,它部分排序的序列应该是前面一部分是已经有序的,后面一部分是跟初始序列一样的,我们就依次性质来遍历,并储存下一个需要插入的元素的索引值m,如果发现是插入排序就将下一个元素插入其中。(我一开始是从后向前遍历,这样是有问题的,计算出的m值会在一些情况下存在偏差,这是因为已排好序的那一部分序列的末尾的几个元素也可能跟初始序列一样)。
4、如果是归并排序,则对初始序列一步一步进行归并排序,知道与所给的部分排序的序列一样,然后再进行一次归并就可以了。
5、测试数据中会有序列中相等的元素出现好几次的情况,所以在3中遍历前一段有序序列的时候要用<=,我要像我一样大大咧咧地写个<最后查了半天才找出错误。
6、case0,2,4是insertion sort,其他都是merge sort,我只能帮大家到这儿了。。。

代码:
//1089#include<iostream>#include<algorithm>using namespace std;int main(){int n;scanf("%d",&n);int origin[100],current[100];for(int i=0;i<n;++i)scanf("%d",&origin[i]);for(int i=0;i<n;++i)scanf("%d",¤t[i]);int m=0;//check if it is a insertion sortwhile(current[m]<=current[m+1])++m;//check the sorted elementint temp=++m;while(temp<n&¤t[temp]==origin[temp])++temp;//check the uninserted elementif(temp==n){//Insertion Sortprintf("Insertion Sort\n");sort(origin,origin+m+1);}else{//Merge Sortprintf("Merge Sort\n");int k=1,flag=1;while(flag){flag=0;//check if the origin sequence has been //merged the same as current sequencefor(int i=0;i<n;++i)if(origin[i]!=current[i])flag=1;k*=2;for(int i=0;i<n/k;++i)sort(origin+i*k,origin+(i+1)*k);sort(origin+(n/k)*k,origin+n);}}for(int i=0;i<n;++i){if(i!=0)printf(" ");printf("%d",origin[i]);}return 0;}


0 0