用二维数组记录学生成绩并排序

五一老师布置的Java作业时用一个二维数组记录学生成绩并对这个数组依据成绩进行排序。
我做了两种方法,各有优缺点。


冒泡法排序

 public static void main(String[] args){
        int[][] x =new int[40][2];
        for (int i=0;i<x.length;i++){
            x[i][0]=i+1;
            x[i][1]=(int)(41*Math.random())+60;
        }
            x[8][1]=100;     //9号是我ヾ(≧▽≦*)o
        for (int j=0;j<x.length;j++){
        for(int i=0;i<x.length-1;i++){
            if(x[i][1]<x[i+1][1]){
                int temp[]=x[i+1];
                x[i+1]=x[i];
                x[i]=temp;
            }
        }
        }
        System.out.println("学生学号  学生成绩");
        for(int i=0;i<x.length;i++) {
            for (int j = 0; j < x[i].length; j++)
                System.out.print(" " + x[i][j] + "   ");
            System.out.println();
        }
    }

简便,计算速度还快。

二维变一维

 public static void main(String[] args) {
        int[][] stu =new int[40][2];
        for (int i=0;i<stu.length;i++){
            stu[i][0]=i+1;
            stu[i][1]=(int)(41*Math.random())+60;
        }
        stu[8][1]=100;     //9号是我ヾ(≧▽≦*)o
        int[] b =new int [stu.length];
        for (int i = 0; i< stu.length; i++){
            b[i]= stu[i][1];
        }
        for (int i = 0; i< stu.length; i++){
            for (int j = 0; j< stu.length-1; j++){
                int temp=Math.min(b[j],b[j+1]);
                b[j]=Math.max(b[j],b[j+1]);
                b[j+1]=temp;
            }
        }
        System.out.println("学号           成绩");
        outer:for (int i = 0; i< stu.length; i++){
            for (int j = 0; j< stu.length; j++){
                if (stu[j][1]==b[i]){
                    if (j<9){
                        System.out.println(stu[j][0]+"   "+ stu[j][1]);
                        stu[j][1]=-1;
                        continue outer;
                    }else{
                        System.out.println(stu[j][0]+"   "+ stu[j][1]);
                        stu[j][1]=-1;
                        continue outer;
                    }
                }
            }
        }
    }

大概原理是用另一个一维数组把原来的数组中的学生成绩单独抠出来进行排序,再根据排序的数字找到原本的学生学号。
刚刚写完的时候我自己都觉得自己写了个什么玩意儿?(+_+)?
缺点很多,首先太长,其次会破坏原数组,除非一开始再拿个别的数组接住。
但是自己写出来的东西肯定要看看有什么优点嘛。(ಥ _ ಥ)
我想到了运行速度,然后用System.currentTimeMillis方法比较两个程序的运行速度,一开始运行40个人的程序,两者都是0毫秒。
自己不死心继续增加人数,然后绘制了一个表格:

人数 40 400 4000 10000 40000 100000
冒泡法耗时(ms) 0 9 68 474 10613 69993
变维法耗时(ms) 0 29 124 463 4471 26950

然后发现自己的程序竟然在数字很大的情况下速度更快!
虽然不知道是什么原理(〃` 3′〃)

你可能感兴趣的:(java自学日记,java,排序算法)