qq_43633220 2019-04-02 22:41
浏览 286

新手写pat题目1035乙级又两个测试点无法通过,请大佬帮忙看下?

原题
1035 插入与归并(25)(25 分)
根据维基百科的定义:

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

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

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

输入格式:

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

输出格式:

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

我的具体问题:
pat题目测试不给看测试用例,有两个用例一直通不过,看见有人说在牛客网有一样的题目,想去那里看测试用例,结果那里测试全过,新人实在没办法了,有没有大佬帮忙看下

try (Scanner in = new Scanner(System.in)) {
            int n = in.nextInt();
            int[] A1 = new int[n];
            for (int i = 0; i < n; i++) {
                A1[i] = in.nextInt();
            }
            int[] A2 = new int[n];
            for (int i = 0; i < n; i++) {
                A2[i] = in.nextInt();
            }
            int orderNums = 1;
            int i;
            for (i = 1; i < n; i++) {
                if (A2[i] > A2[i - 1]) {
                    orderNums++;
                } else
                    break;
            }
            boolean IsMerge = false;
            for (int j = i; j < n; j++) {
                if (A2[j] != A1[j]) {
                    IsMerge = true;
                    break;
                }
            }
            if (IsMerge) {
                System.out.println("Merge Sort");
                int[] tmp = new int[n];
                int star = 0;
                while (star < n) {
                    int j = star, k = orderNums + j;
                    int idx = star;
                    while (j < orderNums + star && k < star + 2 * orderNums && k < n) {
                        if (A2[j] > A2[k]) {
                            tmp[idx++] = A2[k++];
                        } else {
                            tmp[idx++] = A2[j++];
                        }
                    }
                    while (j < orderNums + star && j < n)
                        tmp[idx++] = A2[j++];
                    while (k < orderNums * 2 + star && k < n)
                        tmp[idx++] = A2[k++];
                    for (int l = star; l < star + orderNums * 2 && l < n; l++) {
                        A2[l] = tmp[l];
                    }
                    star += orderNums * 2;
                }
                for (int n1 = 0; n1 < n; n1++) {
                    System.out.print(A2[n1]);
                    if(n1 != n - 1)
                        System.out.print(" ");
                }
            } else {
                System.out.println("Insertion Sort");
                int tmp = A2[orderNums];
                int j;
                for (j = orderNums; j > 0 && A2[j - 1] > tmp; j--) {
                    A2[j] = A2[j - 1];
                }
                A2[j] = tmp;
                for (int n1 = 0; n1 < n; n1++) {
                    System.out.print(A2[n1]);
                    if(n1 != n - 1)
                        System.out.print(" ");
                }
            }
        }
  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
    • ¥15 MCNP里如何定义多个源?
    • ¥20 双层网络上信息-疾病传播
    • ¥50 paddlepaddle pinn
    • ¥20 idea运行测试代码报错问题
    • ¥15 网络监控:网络故障告警通知
    • ¥15 django项目运行报编码错误
    • ¥15 请问这个是什么意思?
    • ¥15 STM32驱动继电器
    • ¥15 Windows server update services