//对公司几万员工年龄排序
#include "vector"
#include "iostream"
using namespace std;
void arrayPrint(int a[], int N)
{
for (int i = 0; i < N; i++)
cout << a[i] << " ";
cout << endl;
}
void sortAges0(int ages[], int length)
{
vector<vector<int> > bucket(100, vector<int>());
for (int i = 0; i < length; i++)
{
bucket[ages[i]].push_back(ages[i]);
}
int count = 0;
for (size_t i = 0; i < 100; i++)
{
for (size_t j = 0; j < bucket[i].size(); j++)
ages[count++] = bucket[i][j];
}
}
void sortAges1(int ages[], int length)
{
int bucket[100] = { 0 };
for (int i = 0; i < length; i++)
{
bucket[ages[i]]++;
}
int count = 0;
for (int i = 0; i < 100; i++)
{
while (bucket[i] > 0)
{
ages[count++] = i;
bucket[i]--;
}
}
}
#include "map"
void sortAges2(int ages[], int length)
{
map<int, int> bucket;
for (int i = 0; i < length; i++)
{
bucket[ages[i]]++;
}
int count = 0;
for (map<int, int>:: iterator iter = bucket.begin(); iter != bucket.end(); iter++)
{
while (iter->second > 0)
{
ages[count++] = iter->first;
iter->second--;
}
}
}
#include "random"
#include "ctime"
#include "fstream"
#define N 100
void test()
{
int ages[N] = { 0 };
ofstream file;
file.open("result.txt", ios::app);
clock_t t0 = clock();
for (int j = 0; j < 10; j++)
{
default_random_engine generator;
uniform_int_distribution<int> distribution(20, 60);
for (int i = 0; i < N; i++)
{
ages[i] = distribution(generator);
}
sortAges0(ages, N);
arrayPrint(ages, N);
}
file << "sortAage0: " << clock() - t0 << "ms" << endl;
t0 = clock();
for (int j = 0; j < 10; j++)
{
default_random_engine generator;
uniform_int_distribution<int> distribution(20, 60);
for (int i = 0; i < N; i++)
{
ages[i] = distribution(generator);
}
sortAges1(ages, N);
arrayPrint(ages, N);
}
file << "sortAage1: " << clock() - t0 << "ms" << endl;
t0 = clock();
for (int j = 0; j < 10; j++)
{
default_random_engine generator;
uniform_int_distribution<int> distribution(20, 60);
for (int i = 0; i < N; i++)
{
ages[i] = distribution(generator);
}
sortAges2(ages, N);
arrayPrint(ages, N);
}
file << "sortAage2: " << clock() - t0 << "ms" << endl;
file.close();
}
int main()
{
test();
return 0;
}
三次运行时间结果:
sortAage0: 176ms
sortAage1: 160ms
sortAage2: 142ms
sortAage0: 160ms
sortAage1: 139ms
sortAage2: 141ms
sortAage0: 148ms
sortAage1: 137ms
sortAage2: 142ms
可以看到,第二和第三时间差不多,只是map建树稍微要麻烦一点,内存方面细算也没有特别的优势。
第一种方法内存O(n)时间也慢。