由于用来计数的数组
C
的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1)即
空间复杂度O(最大值-最小值的差+1)
,这使得计数排序对于数据范围很大的数组,需要大量时间和内存。
算法的步骤如下:
1. 找出待排序的数组中最大和最小的元素
2. 统计数组中每个值为i的元素出现的次数,存入数组C的第i项
3.相同元素计数
4.反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。 但是,计数排序可以用在 基数排序 中的算法来排序数据范围很大的数组。
<span style="font-size: 18px; line-height: 1.5; white-space: pre-wrap; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="cpp">void counting_sort(int A[],int len)
{
int i = 0;
int min,max;
min=max=A[0];
for(i=1; i<len; i++)
{
if (A[i]<min) min=A[i];
if (A[i]>max) max=A[i];
}
int size = max-min+1; //求数组中最大值与最小值的差加上1
int *temp=(int *)malloc(sizeof(int)*size); //开出其空间大小
memset(temp,0,sizeof(int)*size);
for(i=0; i<len; i++) temp[ A[i]-min ]++; //按A[i]做下标将数字填入,并计数
int j=0;
for(i=0; i<size; i++)
{
while(temp[i]>0)
{
A[j] = i+min; //反向将数字输出
j++;
temp[i]--;
}
}
}
//
时间:O(2*n+Size)
空间:
O(最大值-最小值的差+1) O(size)
稳定性:稳定