码迷,mamicode.com
首页 > 其他好文 > 详细

PAT-ADVANCED-1089-Insert or Merge

时间:2015-09-08 12:35:00      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

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:

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

第二次看见这一类题目了,也就是近三次考试出了两次,算是超高频考点了吧。
区分排序的特性很重要。
判断排序方法:以2为块,判断各块内是否有序。因为解是唯一的,如果满足各块内均有序,那么肯定可以是归并排序的一步!反之如果存在某块内无序,则必然是插入排序
对于插入排序,只需要找出不合理的位置pos,再从0-pos位开始sort一下,可以直接使用sort函数或者手动模拟一下
对于归并排序,首先需要找出最大的块Gap(1,2,4,8..)满足各块内均有序,然后再将各(2*Gap)块内的数据排序(任意排序方法);归并排序需要注意最后不满(2*Gap)的部分的处理
技术分享
#include <bits/stdc++.h>
#define LL long long
#define MAXN 100+50
using namespace std;
int n;
int arrNotSorted[MAXN];
int arrSorted[MAXN];
bool insertFlag = false;
bool cmp(const int &a, const int &b){
    return a < b;
}
int  main(){
    scanf("%d", &n);
    for(int i = 0; i < n; ++i){
        scanf("%d", &arrNotSorted[i]);
    }
    for(int i = 0; i < n; ++i){
        scanf("%d", &arrSorted[i]);
    }
    for(int i = 0; i < n; i += 2){
        if(i+1 < n){
            if(arrSorted[i] > arrSorted[i+1]){
                insertFlag = true;
            }
        }
    }
    if(insertFlag){
        //insert
        printf("Insertion Sort\n");
        int pos;
        for(pos = 0; pos < n-1; pos++){
            if(arrSorted[pos] > arrSorted[pos+1]){
                break;
            }
        }
        pos++;
        int val = arrSorted[pos];
        //justify pos
        for(int i = 0; i < pos; ++i){
            if(arrSorted[i] > arrSorted[pos]){
                // i->i+1 ...pos
                for(int j = pos; j > i; --j){
                    arrSorted[j] = arrSorted[j-1];
                }
                arrSorted[i] = val;
                break;
            }
        }
        for(int i = 0; i < n; ++i){
            if(i == 0){
                printf("%d", arrSorted[i]);
            }
            else{
                printf(" %d", arrSorted[i]);
            }
        }
    }
    else{
        printf("Merge Sort\n");
        //merge
        int gap = 4;
        bool flag = true;
        while(1){
            for(int t = 0; t < n/gap; ++t){
                if(!flag){
                    break;
                }
                for(int i = 0; i < gap-1; ++i){
                    if(arrSorted[i+t*gap] > arrSorted[i+1+t*gap]){
                        flag = false;
                        break;
                    }
                }
            }
            if(!flag){
                break;
            }
            gap *= 2;
        }
        for(int t = 0; t < n/gap; ++t){
            sort(arrSorted+t*gap, arrSorted+(t+1)*gap, cmp);
        }
        if(n % gap != 0){
            sort(arrSorted+n/gap*gap, arrSorted+n, cmp);
        }
        for(int i = 0; i < n; ++i){
            if(i == 0){
                printf("%d", arrSorted[i]);
            }
            else{
                printf(" %d", arrSorted[i]);
            }
        }
    }
    return 0;
}
CAPOUIS‘CODE

 

PAT-ADVANCED-1089-Insert or Merge

标签:

原文地址:http://www.cnblogs.com/capouis/p/4791040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!