/**
* 计数排序假设n个输入元素中的每一个都是介于0和k之间的整数, 此处k为某个整数
*基本思想为:对每一个输入元素经,确定出小于x的元素个数,这样就可以把x直接放到它在最终输出数组中的位置上。
*算法复杂度为O(n+k),当k=O(n)时,其运行时间为O(n)
*另一个特点:计数排序是稳定的,具有相同值的元素在输出数组中的相对次序与它们在输入数组中的次序相同
*/
public class CountingSort {
/**
* @param a //存放需要排序的原数组
* @param b //存放排序结果的数组
* @param k //a中的每个元素都介于0和k之间
*/
static void countingSort(int a[],int b[],int k){
//c数组为临时存储区,c存储从0到k每个元素在a中出现的次数,故c的长度为k+1。
int c[]= new int[k+1];
//c[i]中存放了等于i的元素的个数(0=< i <=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]+c[i-1];
//由于c[i]存放小于等于i的元素个数,所以i应该放在b数组中的c[i]位置(由于数组从0开始,所以要减1)
for(int r = a.length-1;r>=0;r--){
int i = a[r];
b[c[i]-1] = i;
//每次c[i]减1可以保证下一个等于i的相同元素,落在b[c[i]-1]的前一个位置
c[i]--;
}
}
//测试.....
public static void main(String[] args) {
int a[]={2,5,3,0,2,3,0,3};
int b[]= new int[8];
countingSort(a,b,5);
for(int i =0;i<b.length;i++)
System.out.println(b[i]);
}
}