Java版算法思想(排序)计数排序
Posted chenry777
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java版算法思想(排序)计数排序相关的知识,希望对你有一定的参考价值。
计数排序是一种在数据满足特定的长度格式,且重复度较低的情况下效率较高的排序算法,在没有数据重复的情况下排序效率可以达到O(n)。
其核心思路就是利用了数组的特性,利用数组的下标对应具体的数据,数组内的元素值对应这种数据出现的次数。
下面让我们直接来看一个例子,比如如果要你对200w名某省考生的某次考试成绩进行一个排序,你会怎么选择? 这边假设成绩最多取小数点后2位。
简单说明一下思路,我们只需要从文件中按行读取数据后,对每个数据*100,然后把结果作为数组的下标存起来,输出的时候再/100即可
import java.io.*;
/**
* 计数排序
*/
public class CountSort2
public static void main(String[] args) throws Exception
String str = null;
String fileName = "D:\\\\200w.txt";
InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName), "UTF-8");
BufferedReader br = new BufferedReader(isr);
int data[] = new int[2100002];
int i = 0;
while ((str = br.readLine()) != null)
// 873.84
double a = Double.valueOf(str);
// 87384
a = a * 100;
// data[0] = 87384
data[(int)a]++;
// System.out.println((int) a);
System.out.println("数据读取完毕,size为" + i);
long start = System.currentTimeMillis();
countSort(data, 0, data.length - 1);
System.out.println("计数排序消耗的时间为:" + (System.currentTimeMillis() - start) + "ms");
public static void countSort(int data[], int min, int max) throws Exception
File file = new File("D:\\\\200w-csort.txt");
Writer out = new FileWriter(file);
for (int i = 0; i <= max; i++)
if (data[i] > 0)
for (int j = 0; j < data[i]; j++)
out.write(((double) (i / 100.0)) + "\\r\\n");
out.close();
输出结果,算上读入写出文件的时间,也只需要300ms,去掉这部分io的时间,可以达到个位数ms的级别
200w的数据话读者有兴趣可以自己写个正态分布算法来实现,或者联系博主提供
以上是关于Java版算法思想(排序)计数排序的主要内容,如果未能解决你的问题,请参考以下文章