算法导论之第八章-计数排序

package test2018.test08;

import java.util.Arrays;

/**
* Filename: Class9Jishupaixu.java
* Description: 计数排序前提是都是整数,而且有上限
* 例如:数组[9,5,3,1,9,7,5,0,4,3,5,6,7,8,1,7,8,9,2,0]
* 你统计出来0有2个,1有2个,2有1个…
* 所有可以得出结果第0至1位是0,第2至3位是1…
* 这就是计数排序原理,复杂度和数字大小和数组长度有关
*
* 还是以一亿条数据,当最大数为10000时,执行时间一秒多,但是达到1000w时,为11.432s多,已经接近合并排序了
* 局限性:第一个不必说,只能是自然数,且有上限
* 试着不仅给数字排序,数字携带学生信息进行排序
* 很遗憾,测不了一亿个学生,因为对象太多
* 一千万个学生按照成绩(0-99分)排序,时间122毫秒,但是感觉很长,因为需要花好几秒建一千万个对象
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2018年8月9日 下午2:38:49
*/

public class Class9Jishupaixu {
    public static void main(String[] args) {
        int maxNum = 100;
        int[] shuzu = ShuZu.suiji(10000000, maxNum);
        Student[] students = new Student[shuzu.length];
        for (int i = 0; i < shuzu.length; i++) {
            students[i] = new Student("学生"+i, shuzu[i]);
        }
        //System.err.println(Arrays.toString(students));
        long stratTime = System.currentTimeMillis();
        students = jishupaixuStudent(students, maxNum);
        long endTime = System.currentTimeMillis();
        System.out.println("计数排序时间:" + (endTime - stratTime));
        //System.err.println(Arrays.toString(students));
        //ShuZu.checkSort(shuzu);
    }

    /**
     * @param students
     * @param maxNum
     * @return
     * @author: guzhangyan
     * @version:2018年8月9日 下午3:19:38 
     * 此方法可以带着实体类一起排序
     */
    private static Student[] jishupaixuStudent(Student[] students, int maxNum) {
        int[] linshi = new int[maxNum];
        Student[] returnStudents = new Student[students.length];
        for (int i = 0; i < returnStudents.length; i++) {
            linshi[students[i].score]++;
        }
        for (int i = 1; i < linshi.length; i++) {
            linshi[i] = linshi[i] + linshi[i - 1];
        }
        // 到此时,临时表里数据为[2,4,5,6,8],表示0有2个,0和1有4个,亦表示第2(Java第1位)位是0
        for (int i = students.length - 1; i >= 0; i--) {
            returnStudents[--linshi[students[i].score]] = students[i];//-1是因为我们从0开始数数
        }
        return returnStudents;
    }

    private static int[] jishupaixu(int[] shuzu, int maxNum) {
        int[] linshi = new int[maxNum];
        int[] returnShuzu = new int[shuzu.length];
        for (int i = 0; i < shuzu.length; i++) {
            linshi[shuzu[i]]++;
        }
        for (int i = 1; i < linshi.length; i++) {
            linshi[i] = linshi[i] + linshi[i - 1];
        }
        // 到此时,临时表里数据为[2,4,5,6,8],表示0有2个,0和1有4个,亦表示第2(Java第1位)位是0
        for (int i = shuzu.length - 1; i >= 0; i--) {
            returnShuzu[--linshi[shuzu[i]]] = shuzu[i];//-1是因为我们从0开始数数
        }
        return returnShuzu;
    }
}

你可能感兴趣的:(笔记)