PAT-BASIC-1035-插入与归并

根据维基百科的定义:

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

归并排序进行如下迭代操作:首先将原始序列看成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

时间: 2024-11-05 16:43:02

PAT-BASIC-1035-插入与归并的相关文章

1035. 插入与归并(25)

1035. 插入与归并(25) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数N (<=100):随后一

PAT-乙级-1035. 插入与归并(25)

1035. 插入与归并(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列. 现给定

Programming Ability Test学习 1035. 插入与归并(25)

1035. 插入与归并(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列. 现给定

P 1035 插入与归并

转跳点 :?? 1035 插入与归并 (25分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正

PAT-B 1035. 插入与归并

题目内容: 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数N (<=100):随后一行给出原始序列的N个

PAT 1035. 插入与归并(25)

根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数N (<=100):随后一行给出原始序列的N个整数:最后一

PAT-乙级-1035 插入与归并

根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数 N (≤100):随后一行给出原始序列的 N

1035 插入与归并 (25 分)

根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数 N (≤100):随后一行给出原始序列的 N

PAT (Basic Level) Practise (中文) 1005

1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候,我们需要计算3.5.8.4.2.1,则当我们对n=5.8.4.2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重

PAT (Basic Level) Practise (中文)1004. 成绩排名 (20)

读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生的姓名 学号 成绩 ... ... ... 第n+1行:第n个学生的姓名 学号 成绩 其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的. 输出格式:对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是成绩最低