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;
}
}