PAT 乙级 1035 java

在提交的过程中一直提示格式错误,发现题目有一个坑,不让数组打印输出的时候首尾出现空格,所以卡了很久,所以在打印输出的时候进行了判断,题目的思路在代码里面。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

/**
 * 题目思路:
 * 1.插入排序:判断前一部分是否有序以及后一部分是否与原数组相同,相同则在不同的位置在进行一次插入排序
 * 2.归并排序:先进行插入排序的判断,不是插入排序那么就是归并排序,在归并的过程中,每归并一次就进行判断是否与原数组相同
 *      在归并的过程中传入一个数组,用于获得下一次归并的结果
 *
 *   题目中要求的归并排序不是使用递归方式实现的,所以在比较中永远不会出现modi=dest的情况,此时,需要使用迭代来实现递归排序
 *
 *  */
public class p1035 {
    private static boolean flag_1=false;
    public static void main(String[] args) throws Exception{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int num=Integer.parseInt(br.readLine());
        String [] str_dest=br.readLine().split("[ ]");
        int []dest=new int[num];
        String [] str_modi=br.readLine().split("[ ]");
        int []modi=new int[num];
        for (int i = 0; i <num ; i++) {
            dest[i]=Integer.parseInt(str_dest[i]);
        }
        for (int i = 0; i <num ; i++) {
            modi[i]=Integer.parseInt(str_modi[i]);
        }

        //开始判断,modi数组是否为插入排序
        boolean result_flag=true;

        int i=0;
        for( ;i<num-1&&modi[i]<=modi[i+1];i++);
        //此时拿到对应有序的索引
        i++;
        for(;i<num;i++){
            if(dest[i]!=modi[i]){
                //有序序列的后面数列与原数组不同,此时不为插入排序
                result_flag=false;
                break;
            }
        }
        int[] result=new int[num];
        if(result_flag==false){//不为插入排序,进行归并操作

            IterMergeSort(dest,result,modi);

        }else{//为插入排序,进行插入排序
            iS(dest,result ,modi );
        }

    }
    public static int[] iS(int[] num,int[] result,int[] dest){
        for (int i = 0; i <num.length-1 ; i++) {
            int temp=num[i+1];
            int j=i+1;
            for (;j>0&&num[j-1]>temp;j--) {
                num[j]=num[j-1];
            }
            num[j]=temp;
            if(flag_1==true){
                System.arraycopy(num, 0, result,0 ,num.length );

                System.out.println("Insertion Sort");
                for (int k = 0; k <result.length ; k++) {
                    if(k==result.length-1){
                        System.out.print(result[k]);
                    }else{
                        System.out.print(result[k]+" ");
                    }
                }

                flag_1=false;
                return num;
            }
            if(Arrays.equals(dest,num )){
                flag_1=true;
            }
        }
        return num;
    }

    //result 用于存储下一次归并的数组,dest为判断数组,num为原数组
    public static void IterMergeSort(int[] num,int[] result,int[] dest){
        //开始对原数组进行迭代排序
            int k=1;
            boolean flag=false;
            while(flag==false){
                if(Arrays.equals(num,dest)){
                    flag=true;
                }
                k=k*2;
                for (int p=0;p<num.length/k;p++){
                    sort(num,p*k ,(p+1)*k-1);
                }
                //不够一组归并的内容,独立出来排序
                sort(num, num.length/k*k,num.length-1 );
                if(flag==true){
                    System.arraycopy(num,0 ,result,0 ,num.length );
                    System.out.println("Merge Sort");
                    for (int m = 0; m <result.length ; m++) {
                        if(m==result.length-1){
                            System.out.print(result[m]);
                        }else{
                            System.out.print(result[m]+" ");
                        }
                    }
                    return;
                }

            }

        }
        public static void sort(int[]a,int from,int to){
        for(int i=from;i<to;i++){
            for(int j=i+1;j<=to;j++){
                if(a[j]<a[i]){
                    int temp=a[i];
                    a[i]=a[j];
                    a[j]=temp;
            }
        }
        }
}

}



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值