计数排序的基本思想: 对每个输入元素x,确定小于x的元素个数。利用这一个信息,就可以直接把x放到它在输出数组中的位置上了。
例如,如果有17个元素小于x,则x就应该在第18个输出位置上。
/**
* 线性排序
* ---------计数排序
*
*/
public class TestFour {
/**
*
* @param a 存储数字
* @param b 存放排序的输出
* @param k 数组a中存储的最大数需要小于k
*/
public static void countingSort(int[] a,int[] b,int k)
{
int[] c = new int[k];
for(int i=0;i<a.length;i++)
c[a[i]]++; //c[i]的含义是:保存着等于i的元素个数
for(int i=1;i<k;i++)
c[i] += c[i-1]; //这里c[i]的含义为:大小不超过i的元素个数
for(int i=a.length-1;i>=0;i--)
{
b[c[a[i]]-1] = a[i]; //这里注意,因为b数组是从0开始的,所以需要-1
c[a[i]]--;
}
}
public static void main(String[] args) {
int[] a = {2,5,3,0,2,3,0,3};
int[] b = new int[a.length];
countingSort(a,b,6);
for(int i=0;i<b.length;i++)
System.out.print(b[i] + " ");
}
}
其中,计数排序的总的时间代价就是O(k+n)。