qq_43633220 2019-04-02 22:41 采纳率: 0%
浏览 287

新手写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(" ");
                }
            }
        }
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 17:53
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            int[] a1 = new int[n], a2 = new int[n];
            for(int i = 0;i < n;i++){
                a1[i] = in.nextInt();
            }
            for(int i = 0;i < n;i++){
                a2[i] = in.nextInt();
            }
    
            boolean isMerge = false;
            for(int i = 1;i < n;i++){
                if(a2[i] > a2[i-1]){
                    isMerge = true;
                    break;
                }
            }
    
            if(isMerge){
                mergeSort(a1,a2,n);
                return;
            }
            insertionSort(a1,a2,n);
    
        }
    
        private static void insertionSort(int[] arr,int start,int end){
            if(end <= start)return;
            int key = arr[start];
            int j = start+1;
            for(;j <= end;j++){
                if(arr[j]<key){
                    swap(arr,j,start);
                    start++;
                }
            }
        }
    
        private static void mergeSort(int[] arr,int[] temp,int start,int end){
            if(start >= end)return;
            int mid = start+(end-start)/2;
            mergeSort(temp,temp,start,mid);
            mergeSort(temp,temp,mid,end);
            merge(temp,arr,start,mid,end);
        }
    
        private static void merge(int[] arr,int[] temp,int start,int mid,int end){
            int left = start,right = mid+1;
            for(int i=start;i<=end;i++){
                if(left>mid||right>end||arr[left]>arr[right]){
                    temp[i]=arr[right++];
                }else{
                    temp[i]=arr[left++];
                }
            }
        }
    
        private static void swap(int[] arr,int i,int j){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    
    评论

报告相同问题?