1.基本思想
假设数序列中小于元素a的个数为n,则直接把a放到第n+1个位置上。当存在几个相同的元素时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到k之间的整数。
2.实现原理
为一组数在排序之前先统计这组数中其他数小于这个数的个数,则可以确定这个数的位置。例如要排序的数为 7 4 2 1 5 3 1 5;则比7小的有7个数,所有7应该在排序好的数列的第八位,同理3在第四位,对于重复的数字,1在1位和2位(暂且认为第一个1比第二个1小),5和1一样位于6位和7位。
3.代码实例
(1)代码:
private static int[] countSort(int[] array, int k) { //建立两个数组:B数组和C数组 int[] C = new int[k + 1];//构造C数组 int length = array.length, sum = 0;//获取A数组大小用于构造B数组 int[] B = new int[length];//构造B数组 // 统计A中各元素个数,存入C数组 for (int i = 0; i < length; i++) { C[array[i]] += 1; } //累积每个元素的个数:建立C数组的值 for (int i = 0; i < k + 1; i++) { sum += C[i]; C[i] = sum; } //遍历A数组,构造B数组 for (int i = length - 1; i >= 0; i--) { B[C[array[i]] - 1] = array[i];//将A中该元素放到排序后数组B中指定的位置 C[array[i]]--;//将C中该元素-1,方便存放下一个同样大小的元素:相同的元素依次排在后面 } return B;//将排序好的数组返回,完成排序 } public static void main(String[] args) { int[] A = new int[]{2, 5, 3, 0, 2, 3, 0, 3}; int[] B = countSort(A, 5); for (int num : B) { System.out.print(num+" "); } }
(2)结果:
0 0 2 2 3 3 3 5
4.算法分析
计数排序是一种非常快捷的稳定性强的排序方法,时间复杂度O(n+k),其中n为要排序的数的个数,k为要排序的数的组大值。计数排序对一定量的整数排序时候的速度非常快,一般快于其他排序算法。但计数排序局限性比较大,只限于对整数进行排序。计数排序是消耗空间发杂度来获取快捷的排序方法,其空间复杂度为O(K) ,同理K为要排序的最大值。