首页 > 其他分享 >PAT Basic 1035. 插入与归并

PAT Basic 1035. 插入与归并

时间:2023-03-20 13:34:01浏览次数:59  
标签:归并 PAT int num Basic 序列 array 排序 1035

PAT Basic 1035. 插入与归并

1. 题目描述:

根据维基百科的定义:

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

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

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

2. 输入格式:

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

3. 输出格式:

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

4. 输入样例:

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

5. 输出样例:

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

6. 性能要求:

Code Size Limit
16 KB
Time Limit
200 ms
Memory Limit
64 MB

思路:

题目要求根据原始序列和中间序列判断排序算法,这里我一开始统计从头开始的最长升序序列的元素个数,然后对比最长升序序列之后的元素是否与原始序列都相同,若都相同则为插入排序,否则为归并排序。

若为插入排序则对最长升序序列再加一个元素做排序即可,若为归并排序则需要统计当前的归并步数,因为归并排序两两组合,所以当前的步数为\(2^n(n=1,\dots,m)\)。从\(n=1\)开始遍历,最后对\(n+1\)步的每一组进行排序。

这里我的解法是利用题目描述取巧的做法,正规的做法可以参考大佬题解:PAT-Basic-1035. 插入与归并 – Lnyan's Blog (llonely.com)

My Code:

#include <stdio.h>
#include <stdlib.h>

void bubbleSort(int *array, int num);
int upOrder(int *array, int num); // retrun 1: ture, 0: flase

int main(void)
{
    int num = 0;
    int *pInt = NULL, *pInt2 = NULL;
    int i = 0;
    int currentStep = 0;
    int flag = 0; // 0: Insertion Sort, 1: Merge Sort
    int j = 0;
    
    scanf("%d", &num);
    pInt = (int *)malloc(sizeof(int) * num);
    pInt2 = (int *)malloc(sizeof(int) * num);
    if(!pInt || !pInt2) return -1; // check malloc return normal
    
    for(i=0; i<num; i++)
    {
        scanf("%d", pInt+i);
    }
    
    for(i=0; i<num; i++)
    {
        scanf("%d", pInt2+i);
    }
    
    for(i=0; i<num; i++) // find currentStep
    {
        currentStep++;
        if(pInt2[i] > pInt2[i+1])
        {
            break;
        }
    }
    
    for(i=currentStep; i<num; i++) // testpoint6 reject, here assume Insertion Sort, for Merge Sort, currentStep is incorrect.
    {
        if(pInt[i] != pInt2[i])
        {
            flag = 1;
            break;
        }
    }
    
    if(flag) //Merge Sort
    {
        currentStep = 2; // least equal 2
        for(i=4; i < num; i*=2) // for Merge Sort, find correct currentStep
        {
            currentStep = i;
            for(j=0; (j+i)<num; j+=i)
            {
                if(!upOrder(pInt2+j, i))
                {
                    currentStep = i/2;
                    break;
                }
            }
            if(currentStep != i)
                break;
        }
        
        printf("Merge Sort\n");
        
        for(i=0; (i+currentStep*2)<=num; i+=currentStep*2)
        {
            bubbleSort(pInt2+i, currentStep*2);
        }
        if(i<num)
        {
            bubbleSort(pInt2+i, num-i);            
        }
        
        for(i=0; i<num; i++) //output sequence
        {
            if(i==0)
                printf("%d", pInt2[i]);
            else
                printf(" %d", pInt2[i]);
        }
    }
    else //Insertion Sort
    {
        printf("Insertion Sort\n");
        
        bubbleSort(pInt2, currentStep+1);
        
        for(i=0; i<num; i++) //output sequence
        {
            if(i==0)
                printf("%d", pInt2[i]);
            else
                printf(" %d", pInt2[i]);
        }
    }
    
    free(pInt);
    free(pInt2);
    
    return 0;
}

void bubbleSort(int *array, int num) // num is number of array's element
{
    int i=0, j=0;
    int flag = 0; // sort already flag
    int temp = 0;
    
    for(i=num-1; i>0; i--)
    {
        flag = 0;
        for(j=0; j<i; j++)
        {
            if(array[j]>array[j+1])
            {
                flag = 1;
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
        if(!flag)
            break;
    }
    
    return;
}

int upOrder(int *array, int num) // retrun 1: ture, 0: flase
{
    int i = 0;
    for(i=0; i < num-1; i++)
    {
        if(array[i]>array[i+1])
            return 0;
    }
    
    return 1;
}

标签:归并,PAT,int,num,Basic,序列,array,排序,1035
From: https://www.cnblogs.com/tacticKing/p/17235961.html

相关文章

  • PAT Basic 1034. 有理数四则运算
    PATBasic1034.有理数四则运算1.题目描述:本题要求编写程序,计算2个有理数的和、差、积、商。2.输入格式:输入在一行中按照 a1/b1a2/b2 的格式给出两个分数形式......
  • matlab genpath命令 查看搜索路径
    在命令窗口中输入genpath命令,可以得到MATLAB所有的搜索路径首尾连接而成的一个长字符串。示例:>>genpathans=D:\R2009a\toolbox;D:\R2009a\toolbox\aero;D:\R2009a\tool......
  • pat 乙级1031 查验身份证
    1#include<stdio.h>2#include<stdlib.h>3#include<string.h>4#include<math.h>56intmain()7{8intn;9scanf("%d",&n);10c......
  • 2023 ICPC香港区域赛(UCup) D Shortest Path Query
    啊对对对,下次题解写详细一点好不好。首先考虑naive的\(O(n^2)\),记\(dp[i][j]\)表示从\(1\)走到\(i\),恰好走了\(j\)条黑边的时候走过白边的最少数量。\(O(nm)\)......
  • pat 乙级 1027 打印沙漏
    ac但写得就像坨答辩过两天我自己都忘了这些变量用来干嘛的了1#include<stdio.h>2#include<stdlib.h>3#include<string.h>4#include<math.h>56int......
  • c-basic
    title:C语言教程tags:Ccategories:C语言abbrlink:a964date:2023-03-1523:45:43C语言教程前言C语言特性C语言的设计C语言具有高效性C语言具有可移......
  • PATH
    Path环境变量的作用它提供了windows命令行中指令的可执行文件(比如:.exe文件)路径,让我们在命令行中输入命令时,能够找到对应的可执行文件执行简单说:让命令在命令行中......
  • xpath定位方法
    一.常用定位方法1.根据文本值定位元素查找文本值为DNS的div元素text1=html.xpath("//div[text()='DNS']")text2=html.xpath("//div[text()='DNS']/text()")#获......
  • PAT Basic 1033. 旧键盘打字
    PATBasic1033.旧键盘打字1.题目描述:旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字......
  • PAT Basic 1031. 查验身份证
    PATBasic1031.查验身份证1.题目描述:一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:首先对前17位数字加权求和,权重分配......