//==================以下为自己实现=====================
void SortAges(int ages[],int length)
{
if(ages == NULL || length<1)
{
return;
}
const int oldAge=99;
int count[oldAge+1];
int i;
for(i=0; i<=oldAge; i++)
{
count[i]=0;
}
for(i=0; i<length; i++)
{
if(ages[i] < 0 || ages[i] > oldAge)
{
continue;
}
count[ages[i]]++;
}
int index=0, j;
for(i=0; i<=oldAge; i++)
{
for(j=0; j<count[i];j++)
{
ages[index++] = i;
}
}
}
int main(int argc, char *argv[])
{
int a[9] = {5,5,5,1,1,1,2,3,4};
SortAges(a, 9);
int i=0;
for(i=0; i<9; ++i)
{
printf(" %d ", a[i]);
}
system("PAUSE");
return 0;
}
//====================以下为转载=======================
https://blog.csdn.net/u010425776/article/details/50813848
题目:对某公司所有员工的年龄进行排序,要求时间复杂度为O(n)
分析:
在已有的排序算法中,性能最好的是快速排序,但是他在最好的情况下时间复杂度只能达到O(nlogn),无法满足本题的要求。但是我们可以从“年龄”这一特殊条件入手。
年龄具有显著的特征,那就是这些数值都分布在0-99之间。由于待排序的数值均在0-99这个固定区间内,因此我们可以用一个长度为100的数组,记录0-99这100个年龄出现的次数。我们只需要扫描一遍所有员工的年龄,就能统计出这个数组。最后只需要将该数组展开即可获得想要的结果。
-
/**
-
* 对某公司所有员工的年龄进行排序,要求时间复杂度为O(n)
-
* @author chibozhou
-
*
-
*/
-
public class AgeSort {
-
/**
-
* 排序函数
-
* @param ages 存放公司全体人员年龄的数组
-
*/
-
public static void ageSort(int[] ages){
-
//countAge的下标i代表年龄,countAge[i]代表年龄为i的员工人数
-
int[] countAge = new int[ 100];
-
-
//健壮性判断
-
if(ages== null || ages.length<= 0){
-
System.out.println( "数组为空!");
-
return;
-
}
-
for( int i= 0;i<ages.length;i++){
-
if(ages[i]< 0 || ages[i]> 99){
-
System.out.println( "数组中存在非法年龄!");
-
return;
-
}
-
}
-
-
//统计每个年龄的人数,存储在countAge数组中
-
for( int i= 0;i<ages.length;i++)
-
countAge[ages[i]]++;
-
-
//将countAge数组展开,存放在ages数组中
-
int curIndex = 0; //用于记录ages数组当前下标
-
for( int i= 0;i<countAge.length;i++){
-
for( int j= 0;j<countAge[i];j++){
-
ages[curIndex] = i;
-
curIndex++;
-
}
-
}
-
}
-
}
//==============================以下为转载-=======================
https://blog.csdn.net/liyf__88/article/details/72541005
/*
.................................//排序算法--对公司员工的年龄排序,要求时间效率O(n)
解题思路:
公司员工的年龄有一个范围 这里规定0~99
用长度100的整数数组作为辅助空间换来了O(n)的时间效率。
*/
#include<stdio.h>
#define N 10
void SortAges(int ages[],int length)
{
int i ;
if(ages == NULL ||length <= 0)
return ;
const int oldAge = 99; //年龄的允许范围是0~99
int timeOfAge[oldAge+1];
for(i = 0;i<=oldAge;i++) //将数组timeOfAge[0]~timeOfAge[99]初始化为0
timeOfAge[i] = 0;
for(i = 0;i<length;++i)
{
int age = ages[i]; //员工年龄
if(age < 0||age > oldAge)
printf("age out of range\n");
++timeOfAge[age];// 其年龄下标对应的数组位置大小加1 ,即用来统计每个年龄出现的次数
}
int index = 0;
for(i = 0;i <= oldAge;i++)
{
int j ;
for(j = 0;j<timeOfAge[i];++j)
{
ages[index] = i; //某个年龄出现了多少次,就在数组ages里设置几次该年龄
++index;
}
}
}
int main()
{
int age[N];
int i;
printf("请输入员工的年龄:\n");
for(i = 0;i<N;i++)
{
scanf("%d",&age[i]);
}
SortAges(age,N);
printf("排序后员工的年龄:\n");
for(i = 0;i<N;i++)
printf("%d ",age[i]);
return 0;
}
#endif