剑指offer-第二章排序之年龄排序
题目:对某个公司的人的年龄(0-99)进行排序,该公司的总人数为几万人。要求时间复杂度为O(n),可以辅助O(n)的空间。
思路:实现函数为void SortAge(int ages[],int len).辅助空间为一个整型数组timesOfAge[100],用来存放每个个年龄的人数(当满足i<len,如果age[i]<=99&&age[i]>=0时候,有timesOfAge[age[i]]++,i++)。用一个嵌套的for对ages[],进行排序。外层用i来代表年龄上限为100,内层用j来代表各年龄的人数,timeOfAge[i]来表示上限。用index代表ages[]数组的下标。执行ages[index++]=i.实现对年龄的排序。
#include<stdio.h> #include<string.h> /* 计数排序,员工年龄肯定在0-99之间 */ void SortAge(int ages[],int len) { if(ages == NULL || len<1) return ; int timesOfAge[100]; memset(timesOfAge,0,sizeof(timesOfAge)); int i; //计算每个年龄员工的个数 for(i=0;i<len;i++) { if(ages[i]<=99 && ages[i]>=0) timesOfAge[ages[i]]++; } //对ages进行排序 int index = 0; for(i=0;i<100;i++) { int j = 0; while(j<timesOfAge[i]) { ages[index++] = i; j++; } } } int main() { int ages[] = {33,34,45,24,36,23,21,22,19,26,45,34,21,34,34,33,52,22,32,25,27,43,22,21,20,33,26,27,15,29}; int len = 30; SortAge(ages,len); int i; for(i=0;i<len;i++) printf("%d ",ages[i]); printf("\n"); return 0; }