-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVectorBucketSort.cpp
More file actions
70 lines (64 loc) · 1.95 KB
/
VectorBucketSort.cpp
File metadata and controls
70 lines (64 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "VectorBucketSort.h"
#include "MathService.h"
#include <cmath>
#include <vector>
using std::vector;
using std::size_t;
void VectorBucketSort::sort(vector<unsigned int>& data)
{
vector<vector<unsigned int> >* buckets = getBucketsVector();
bool was_insert_to_bucket = true;
unsigned int digit_in_number = 1;
while (was_insert_to_bucket)
{
was_insert_to_bucket = putNumbersIntoBuckets(buckets,
data,
digit_in_number);
putNumbersBackIntoDataVector(buckets, data);
++digit_in_number;
}
delete buckets;
}
vector<vector<unsigned int> >* VectorBucketSort::getBucketsVector()
{
vector<vector<unsigned int> >* pointer_to_buckets =
new vector<vector<unsigned int> >;
const vector<unsigned int> empty_vector;
for (int i = 0; i < 10; i++)
{
pointer_to_buckets->push_back(empty_vector);
}
return pointer_to_buckets;
}
bool VectorBucketSort::putNumbersIntoBuckets(
vector<vector<unsigned int> > *buckets,
vector<unsigned int>& data,
unsigned int digit_in_number)
{
bool digit_was_not_only_zero = false;
while(data.size() > 0)
{
unsigned int digit =
MathService::getDigitOfNumber(data.back(), digit_in_number);
if(digit != 0)
{
digit_was_not_only_zero = true;
}
buckets->at(digit).push_back(data.back());
data.pop_back();
}
return digit_was_not_only_zero;
}
void VectorBucketSort::putNumbersBackIntoDataVector(
vector<vector<unsigned int> >* buckets,
vector<unsigned int>& data)
{
for(int i = 0; i < 10; ++i)
{
while(not buckets->at(i).empty())
{
data.push_back(buckets->at(i).back());
buckets->at(i).pop_back();
}
}
}