思想:
设置数组b、c,c用于放置a数组中每个元素的值出现的次数,然后得出a中元素<=i的元素个数再次放入c中,其中c的下标对应于a中每个元素的值.此时c[a[i]-1]就是a[i]在b中的位置.
这种排序适用于待排序的数组元素最大值已经给定的情况下使用,而且待排序的每个元素都>=0。计数排序是一种线性时间复杂度的排序,设定a[0:N-1]中元素的最大值为M,这排序的时间复杂度O(M+N)。
设置数组b、c,c用于放置a数组中每个元素的值出现的次数,然后得出a中元素<=i的元素个数再次放入c中,其中c的下标对应于a中每个元素的值.此时c[a[i]-1]就是a[i]在b中的位置.
这种排序适用于待排序的数组元素最大值已经给定的情况下使用,而且待排序的每个元素都>=0。计数排序是一种线性时间复杂度的排序,设定a[0:N-1]中元素的最大值为M,这排序的时间复杂度O(M+N)。
/**
* CountingSort.java
* 计数排序
* @author Administrator
*/
public class CountingSort {
/**
* 无序数组a的元素满足必须有一个最大值为m(m>=0)最小值不小于0
*/
public static void countingSort(int[] a, int m) {
int n = a.length;
int[] b = new int[n];
int[] c = new int[m + 1];
/*
//对c语言是必须的
for(int i = 0; i <=m; i ++)
c[i] = 0;
*/
//存放a中元素等于i的元素个数.
for(int i = 0; i < n; i ++)
c[a[i]] += 1;
//存放a中元素<=i的元素个数.
for(int i=1; i <= m; i ++)
c[i] += c[i-1];
//把a中每个元素放入b中正确的位置.
for(int i = n; i >0; i --)
{
b[c[a[i - 1]] - 1] = a[i - 1];
c[a[i - 1]] -= 1;//a中如果有元素的值相等此句是必须的.
}
//把b[0:n-1]的元素复制到a中
Util.copy(a, b, 0, n-1);
}
public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.out.println("请输入数字(>=0)以空格隔开");
System.exit(-1);
}
int[] a = new int[args.length];
for (int i = 0; i < args.length; i++)
a[i] = Integer.parseInt(args[i]);
//检查输入元素的值.
for(int i=0; i< a.length; i++)
if(a[i]<0){System.out.println("每个元素的值不小于0");System.exit(-
1);}
//获取输入元素的最大值对应的下标.
int mid = 0;
for(int i = 0 ; i < a.length-1; i++){
if(a[mid] < a[i+1]) mid = i+1;
}
countingSort(a, a[mid]);
// 输出排序后的数组元素。
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}