取值范围一定(0-100),且远小于记录数的排序(可能上万)。
这是如果可以使用O(n)的辅助空间,可以使时间复杂度降低到O(n)。
用age[10]模拟年龄1-10。25个数据模拟员工数。age数组记录下标表示的年龄人数。统计完age相当于排好了序,然后写入data数组就可以。
#include <stdio.h>
#include <stdlib.h>
void sort(int data[],int length)
{
int age[10],i,j,c = 0;
if(data == NULL || length <= 0)
return;
for(i = 0;i < 10;i++){
age[i] = 0;
}
for(i = 0;i < length;i++){
if(data[i] < 0 || data[i] > 10)
return;
age[data[i]] ++;
}
for(i = 0;i < 10;i++)
for(j = 0;j < age[i];j++)
data[c++] = i;
}
void main()
{
int d[25] = {1,2,3,4,5,4,6,5,4,8,4,7,2,5,5,5,3,9,7,7,4,6,7,5,8},i;
sort(d,25);
for(i = 0;i < 25;i++)
printf("%d ",d[i]);
}