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));
  }
}