思路:
计数排序不是基于比较的排序,其核心思想是将输入数据的值转换为键值作为新开辟数组的下标,使用该下标对应数组元素的大小代表该值在数组中出现的次数。(一般建议数组元素为正整数,不过对于负整数和浮点数,也可以通过额为的修正来进行排序)。
基本步骤:
- 计算数组中的最大元素和最小元素;
- 根据数组中元素值的大小范围建立一个计数数组;
- 计算原始数组中每个值出现的次数,并插入到计数数组中;
- 依次将计数数组中不为空的元素的下标对应的值输出到原始数组中。
时间复杂度:
最好:;平均:;最坏: (n为元素个数,k为计数数组的大小)
程序:
void find_min_max(int array[],int array_size,int *min,int *max)
{
int min_p,max_p,i;
min_p=0;
max_p=array_size-1;
for(i=0;i<array_size;i++)
{
if(array[i]<array[min_p])
min_p=i;
if(array[i]>array[max_p])
max_p=i;
}
*min=array[min_p];
*max=array[max_p];
}
void counting_sort(int array[],int array_size)
{
int i,j,min,max,size,offset;
find_min_max(array,array_size,&min,&max);
offset=0-min;
size=max-min+1;
int * count_array=calloc(size,sizeof(int));
if(count_array==NULL)
{
printf("No full space! \n");
return;
}
for(i=0;i<array_size;i++)
{
count_array[array[i]+offset]++;
}
for(i=0,j=0;i<size;i++)
{
while(count_array[i]--)
{
array[j++]=i-offset;
}
}
free(count_array);
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int array[]={100,96,88,75,63,52,41,36,28,96,19,6,0,-19,-105,28,52,52,52};
int array_size=sizeof(array)/sizeof(int);
printf("Original array:\n");
for(i=0;i<array_size;i++)
printf(" %d, ",array[i]);
printf("\n");
counting_sort(array,array_size);
printf("Sorted array:\n");
for(i=0;i<array_size;i++)
printf(" %d, ",array[i]);
printf("\n");
return 0;
}