算法的步骤:
1.找出待排序的数组中最大和最小的元素
2.统计数组中每个值为i的元素出现的次数,存入数组C的第i项
3.对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
4.反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
源代码:
#include<stdio.h>
//double start_time = 0;
//double end_time = 0;
void counting(int *a, int *b, int len, int max)
{
int i,j,k;
int *c = (int *)malloc(sizeof(int) * max + 1);
if(c == NULL)
{
return;
}
memset(c, 0, sizeof(int) * max + 1);
//start_time = clock();
//统计数组中每个值为i的元素出现的次数
for(i = 0; i < len; i++)
{
*(c + *(a + i)) = *(c + *(a + i)) + 1;//++;
}
//对计数进行累加
for(j = 1; j <= max; j++)
{
*(c + j) = *(c + j) + *(c + j - 1);
}
//反向填充目标数组
for(k = len - 1; k >= 0; k--)
{
*(b + *(c + *(a + k)) - 1) = *(a + k);
*(c + *(a + k)) = *(c + *(a + k)) - 1;//--;
}
//end_time = clock();
free(c);
}
int main()
{
int a[10] = {3, 2, 3, 5, 8, 7, 8, 2, 9, 0};
int b[10] = {0};
int i;
//此处省略了待排数组最大值的查找
counting(a, b, 10, 9);
// printf("time cost:%f\n", end_time - start_time);
for(i = 0; i < 10; i++)
{
printf("%d\n",b[i]);
}
return 0;
}