今天笔试4399做了一道归并排序,记录一下

题目是,输入一组数据用归并排序进行排序。

执行过程是:

import java.util.Scanner;//不写是无法用Scanner类的
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);//把输入数字写到scanner中
        String input=scanner.next();//将字符串一个个输入到input中
        String[] s=input.split(",");//用,隔开后一个个装到数组中,此时数组中存放的还是字符
        int []nums=new int[s.length];//建立一个空字符串
        for(int i=0; i<s.length; i++){
            nums[i]=Integer.parseInt(s[i]);//将字符强行转换成int类型装进数组中
        }
        int[]tmp=new int[s.length];//再new一个新的数组tmp
        mergeSort(nums,0,nums.length-1,tmp);
        for(int i=0;i<nums.length;i++){
            System.out.print(nums[i]+" ");//用空格隔开输出
        }
    }
    
    public static void mergeSort(int[] arr,int low,int height,int[] tmp){
        if (low<height){
            int bim=(low+height)/2;//取中间值,假设3/2的int类型值等于1,向下取整
            mergeSort(arr,low,bim,tmp);//分为左半边序列,一直分,分到只剩一个或者两个
            mergeSort(arr,bim+1,height,tmp);//分为右半边序列
            merge(arr,low,bim,height,tmp);//将值进行比较,合并
        } 
    }
    public static void merge(int[]arr,int low,int bim,int height,int[]tmp){
        int i=0;
        int j=low,k=bim+1;
        while(j<=bim&&k<=height){
            if(arr[j]<arr[k]){//取小的值放前面
                tmp[i++]=arr[j++];
            }else{
                tmp[i++]=arr[k++];
            }
        }
        while(j<=bim){//左边剩余的值放到后面
            tmp[i++]=arr[j++];
        }
        while(k<=height){//右边剩余的值放后面
            tmp[i++]=arr[k++];
        }
        for (int t=0;t<i ;t++ ){
            arr[low+t]=tmp[t];//low把右边序列的分开
        } 
    }
}

归并排序看起来不难,但理解起来还是有点难度。

posted on 2023-03-30 01:39  阿霖找BUG  阅读(18)  评论(0)    收藏  举报