I'm looking for any sort of optimization and/or conventional practice tips, such as using the appropriate data types and naming my variables appropriately.
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
constexpr short MIN_ELEMS = 3;
constexpr short MAX_ELEMS = 15;
constexpr short LARGEST_ELEM_INT = 99;
void fill_vector(std::vector<int> &v, short MAX_ELEMS, short LARGEST_ELEM_INT);
void print_vector(const std::vector<int>::iterator start, const std::vector<int>::iterator end);
void max_heap(const std::vector<int>::iterator elem, const std::vector<int>::iterator start, std::vector<int>::iterator end);
void heap_sort(const std::vector<int>::iterator start, const std::vector<int>::iterator end);
int main() {
srand(time(NULL));
short random_range = rand() % MAX_ELEMS + 1;
short num_of_elems = random_range < MIN_ELEMS ? MIN_ELEMS : random_range; // prevents num_of_elems from being less than MIN_ELEMS
std::vector<int> v;
fill_vector(v, num_of_elems, LARGEST_ELEM_INT);
print_vector(v.begin(), v.end());
heap_sort(v.begin(), v.end());
print_vector(v.begin(), v.end());
}
void fill_vector(std::vector<int> &v, short num_of_elems, short LARGEST_ELEM_INT) {
short i = 0;
while (++i, i <= num_of_elems) {
v.push_back(rand() % LARGEST_ELEM_INT);
}
}
void print_vector(const std::vector<int>::iterator start, const std::vector<int>::iterator end) {
for (auto elem = start; elem != end; ++elem) {
std::cout << *elem << ' ';
}
std::cout << '\n';
}
void max_heap(const std::vector<int>::iterator elem, const std::vector<int>::iterator start, const std::vector<int>::iterator end) {
auto biggest = elem;
auto left_child = start+((elem-start)*2+1);
auto right_child = start+((elem-start)*2+2);
if (left_child < end && *left_child > *biggest) {
biggest = left_child;
}
if (right_child < end && *right_child > *biggest) {
biggest = right_child;
}
if (elem != biggest) {
auto val = *biggest;
*biggest = *elem;
*elem = val;
max_heap(biggest, start, end);
}
}
void heap_sort(const std::vector<int>::iterator start, const std::vector<int>::iterator end) {
// sort vector to max heap
for (auto i = start+((end-start)/2)-1; i >= start; --i) {
max_heap(i, start, end);
}
// sort vector in ascending order
for (auto i = start; i != end-1; ++i) {
auto val = *start;
*start = *(start+(end-i-1));
*(start+(end-i-1)) = val;
max_heap(start, start, start+(end-i-1));
}
}