前提假设: 假设输入的待排序的n个元素中的每一个值都在0到k区间中的一个整数(k为某个整数)。
基本思想: 对于每一个输入元素x,统计小于x的元素个数,确定x元素在输出数组中的位置。例如,如果有17个元素小于x,则x就应该放在输出数组的第18个位置。当有元素相等时,这个情况另外在讨论。
时间复杂度: O(k+n),当k=O(n)时,该算法的时间复杂度为O(n)。此时,我们会用计数算法。
算法特点: 该算法是稳定的;对于相同的两个数来说,在输入数组中先出现的数,在输出数组中也先出现。
java实现:
/***
* 计数排序
* @param A 待排序的数组
* @param B 结果数组
* @param k 数组A中的所有元素都在0到k区间的一个整数
*/
public static void countingSort(int[] A,int[] B,int k){
//提供临时存储空间,用来统计值等于A[j]的元素的个数
int[] C=new int[k];
for (int i = 0; i < k; i++) {
C[i]=0;
}
for (int i : A) {
C[i]++; //统计值等于A[i]的元素的个数
}
//统计小于等于i的元素的个数
for (int i = 1; i <= k; i++) {
C[i]=C[i]+C[i-1];
}
//把每个A[i]放在输出数组B的正确位置
//对于每个A[i]来说,C[A[i]]就是A[i]在输出数组中的位置
for (int i = A.length-1; i >= 0; i--) {
B[C[A[i]]-1]=A[i];
//当下一个值等于A[i]的元素,可以直接放在输出数组中A[i]的前一个位置
C[A[i]]--;
}
}