1.对上万个员工的年龄进行排序,时间复杂度不超过O(n),空间复杂度为常数级别(特点:带排序的值有一个范围)
void sortAge(int age[],int length){
const int oldestage = 99;
int timeAge [oldestage + 1]={
0}; //第i个位置存i岁的人的个数
for(int i = 0;i<length ; ++i){
if( age[i]<0 || age[i] >99)
++ timeage [ age[i]] ;
}
int index = 0;
for(int i = 0 ;i<oldestage ; ++i){
for(int j = 0 ;j<timeage[i];++j)
{ age[index] = i; //连续timeage[i]个人都是i岁
++index;
}
}
}
2.旋转数组
输入一个递增数组的旋转数组,输出旋转数组的最小元素。
旋转之后的数组实际上可以划分为两个排序的子数组(采用二分查找的思想),用两个指针分别指向第一个元素和最后一个元素,找到中间的元素,判断中间位置前后元素的之判断该位置实在前段数组还是后段数组,
还是两段