/*******************************************************************
Copyright(c) 2016, Harry He
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//
#include <iostream>
#include <cstdio>
/*
Q:
对一个公司的员工年龄进行排序,公司员工有几万人
S:
(年龄数字的大小是在一个较小的范围之内,允许使用常量大小的空间,不得超过O(n))
根据每个年龄数的出现次数进行统计,然后排序
*/
void sortAges(int ages[], int length)
{
if(ages == nullptr || length <= 0)
return;
const int maxAge = 99;
int timesOfAges[maxAge + 1];
for(int i = 0; i <= maxAge; ++i)
timesOfAges[i] = 0;
for(int j = 0; j < length; ++j)
{
int age = *(ages + j);
if(age < 0 || age > maxAge)
{
std::cout << "age error! " << age << std::endl;
return;
}
++timesOfAges[age];
}
int index = 0;
for(int i = 0; i <= maxAge; ++i)
{
for(int j = 0; j < timesOfAges[i]; ++j)
{
ages[index] = i;
++index;
}
}
}
void test_1()
{
std::cout << "test 1" << std::endl;
int ages[] = {28, 45, 89, 37, 72, 32, 42, 12, 52, 34, 22, 25, 26, 28, 19, 27, 24, 22, 42};
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
sortAges(ages, 19);
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
}
void test_2()
{
std::cout << "test 2" << std::endl;
int ages[] = {0, 45, 89, 37, 72, 32, 42, 12, 52, 34, 22, 25, 26, 28, 19, 27, 24, 22, 42};
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
sortAges(ages, 19);
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
}
void test_3()
{
std::cout << "test 3" << std::endl;
int ages[] = {0, 45, 89, 37, 72, 32, 42, 12, 52, 34, 22, 25, 26, 28, 19, 27, 24, 22, -1};
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
sortAges(ages, 19);
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
}
void test_4()
{
std::cout << "test 4" << std::endl;
int ages[] = {0, 45, 89, 37, 72, 32, 42, 12, 52, 34, 22, 25, 26, 28, 19, 27, 24, 22, 99};
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
sortAges(ages, 19);
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
}
void test_5()
{
std::cout << "test 5" << std::endl;
int ages[] = {0, 45, 89, 37, 72, 32, 42, 12, 52, 34, 22, 25, 26, 28, 19, 27, 100, 22, 42};
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
sortAges(ages, 19);
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
}
void test_6()
{
std::cout << "test 6" << std::endl;
int ages[] = {0, 45, 89, 37, 72, 32, 42, 12, 52, 34, 22, 25, 26, 28, 19, 27, 100, 22, 42};
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
sortAges(ages, 0);
for(auto e:ages)
std::cout << e << " ";
std::cout << std::endl;
}
void test_sortAges()
{
test_1();
test_2();
test_3();
test_4();
test_5();
test_6();
}
int main(int argc, char**argv)
{
test_sortAges();
return 0;
}
剑指offer-公司员工年龄排序
最新推荐文章于 2020-12-22 17:46:14 发布