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版算法思想(排序)计数排序的主要内容,如果未能解决你的问题,请参考以下文章

Java版算法思想(排序)选择&冒泡&快排

Java版算法思想(排序)选择&冒泡&快排

Java版算法思想(排序)插入&希尔&归并

Java版算法思想(排序)插入&希尔&归并

经典十大排序算法(含升序降序,基数排序含负数排序)Java版完整代码建议收藏系列

基于比较的七种常见排序算法