计数排序是一个不需要比较的,类似于桶排序的线性时间排序算法。该算法是对已知数量范围的数组进行排序。其时间复杂度为O(n),适用于小范围集合的排序。
比如一千万个整数,每个数的范围在[-1000,1000],怎样对他们排序最快?答案应该是计数排序。因为时间复杂度为o(n),线性复杂度。
(1)基本思想:
一组数在排序之前先统计这组数中小于这个数的个数,则可以确定这个数的位置,即每个数都知道自己该在的位置,排序自然就快了。
(2)方法:
首先需要三个数组,第一个数组记录要排序的数列,第二个数组要记录比某个数小的其他数字的个数,所以第二个数组的大小应当为K(数列中最大数的大小),第三个数组记录排序好的数组。
接着需要确定数组最大值并确定B数组的大小。并对每个数由小到大的记录数列中每个数的出现次数。因为是有小到大通过出现次数可以通过前面的所有数的出现次数来确定比这个数小的数的个数,从而确定其位置。
对于重复的数,每排好一个数则对其位置数进行减减操作,以此对完成其余相同的数字进行排位。
(3)代码:
void countsort(int *a,int *sort,int length) { int max=a[0]; for(int i=0;i<length;i++) { max=a[i]>max?a[i]:max; } int *count= new int[max+1]; memset(count,0,(max+1)*sizeof(int)); for(int i=0;i<length;i++) { count[a[i]]++; } for(int i=1;i<max+1;i++) count[i]+=count[i-1]; for(int i=length;i>0;i--) { sort[count[a[i-1]]-1]=a[i-1]; count[a[i-1]]--; } delete count; }