之前文章介绍的一些排序算法都是基于比较来进行排序的,故它们在平均情况下的时间复杂度最好也不过是线性对数级别。这里我们来介绍一种简单的基于非比较的排序算法——Counting Sort 计数排序,其时间复杂度可以达到线性级别
基本思想
Counting Sort 计数排序,顾名思义,就是统计待排序数组元素的出现次数。其基本思想比较简单:
根据待排序元素的数值范围大小k(max-min+1),建立一个k大小的频数统计数组counts。对于counts数组而言,其索引范围 0 ~ k-1,正好可以对应到待排序元素的取值范围min~max上
统计待排序元素element的次数,并其存储到counts数组中,即counts[ elemet-min ] = countValue
待计数统计完成后遍历counts数组,根据次数值来输出原待排序元素值,此时即完成排序
这里给出计数排序在Java下的实现:
/**
* 计数排序
*/
public class CountingSort {
/**
* 升序排列 (非稳定)
*/
public static void sort1() {
// 获取测试用例
int[] array = getTestCase();
int size = array.length;
System.out.println("before sort: " + Arrays.toString(array) );
// 求取最值
int[] minMax = getMinMax(array);
int min = minMax[0];
int max = minMax[1];
// 根据数据范围创建统计数组
int k = max-min+1;
<