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

PAT-BASIC-1035-插入与归并

时间:2015-07-16 22:07:46      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:

根据维基百科的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:

输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:

首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。

 

输入样例1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

输出样例1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

输入样例2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

输出样例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-BASIC-1035-插入与归并

标签:

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

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