题解 | #成绩排序#Java归并稳定排序,内部类存数据

成绩排序

https://www.nowcoder.com/practice/8e400fd9905747e4acc2aeed7240978b

为啥排序题这么多人用sort啊?个人感觉这类题考的就是对排序算法的掌握。比如这个题一个考点就是哪些排序是稳定排序(冒泡、插入、归并、计数)。冒泡插入就是基本的O(n^2),归并就是进阶的O(nlogn)。然后数据用内部类存储(用二维数组也可),然后在类里面写一个比较器用来应对正序逆序排序。

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int count=in.nextInt();
        int order=in.nextInt();
        ArrayList<Student> rank=new ArrayList<>();
        Main main=new Main();
        for(int i=0; i<count; i++){
            String name=in.next();
            Integer grade=in.nextInt();
            rank.add(main.new Student(name,grade));
        }
        if(rank.size()>1){
            main.mergeSort(rank,0,count-1,order);
        }
        for(Main.Student student: rank){
            System.out.println(student.name+" "+student.grade);
        }
    }

    void mergeSort(ArrayList<Student> seq, int left, int right, int order){
        if(left>=right){
            return;
        }
        int mid=(left+right)>>1;
        mergeSort(seq,left,mid,order);
        mergeSort(seq,mid+1,right,order);
        merge(seq,left,mid,right,order);
    }

    void merge(ArrayList<Student> seq, int left, int mid, int right, int order){
        ArrayList<Student> copy=new ArrayList<>(right-left+1);
        int i=left;
        int j=mid+1;
        while(i<=mid&&j<=right){
            if(seq.get(i).compareTo(seq.get(j),order))
                copy.add(seq.get(i++));
            else
                copy.add(seq.get(j++));
        }
        while(i<=mid){
            copy.add(seq.get(i++));
        }
        while(j<=right){
            copy.add(seq.get(j++));
        }
        for(Student student: copy){
            seq.set(left++,student);
        }
    }

    class Student{
        String name;
        Integer grade;

        Student(String name, Integer grade){
            this.name=name;
            this.grade=grade;
        }

        boolean compareTo(Student def, int order){
            if(order==1) return grade<=def.grade;
            return grade>=def.grade;
        }
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务