年龄排序问题

//==================以下为自己实现=====================

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个年龄出现的次数。我们只需要扫描一遍所有员工的年龄,就能统计出这个数组。最后只需要将该数组展开即可获得想要的结果。

  1. /**
  2. * 对某公司所有员工的年龄进行排序,要求时间复杂度为O(n)
  3. * @author chibozhou
  4. *
  5. */
  6. public class AgeSort {
  7. /**
  8. * 排序函数
  9. * @param ages 存放公司全体人员年龄的数组
  10. */
  11. public static void ageSort(int[] ages){
  12. //countAge的下标i代表年龄,countAge[i]代表年龄为i的员工人数
  13. int[] countAge = new int[ 100];
  14. //健壮性判断
  15. if(ages== null || ages.length<= 0){
  16. System.out.println( "数组为空!");
  17. return;
  18. }
  19. for( int i= 0;i<ages.length;i++){
  20. if(ages[i]< 0 || ages[i]> 99){
  21. System.out.println( "数组中存在非法年龄!");
  22. return;
  23. }
  24. }
  25. //统计每个年龄的人数,存储在countAge数组中
  26. for( int i= 0;i<ages.length;i++)
  27. countAge[ages[i]]++;
  28. //将countAge数组展开,存放在ages数组中
  29. int curIndex = 0; //用于记录ages数组当前下标
  30. for( int i= 0;i<countAge.length;i++){
  31. for( int j= 0;j<countAge[i];j++){
  32. ages[curIndex] = i;
  33. curIndex++;
  34. }
  35. }
  36. }

//==============================以下为转载-=======================

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

猜你喜欢

转载自blog.csdn.net/qq_20398345/article/details/80881272