I wanted to practice using templates since I have no experience with them, so I implemented these sorting algorithms.
Selection Sort:
template<typename Container>
void selectionSort(Container& numbers)
{
for (auto iter = std::begin(numbers), iterEnd = std::end(numbers); iter != iterEnd; ++iter)
{
auto minNum = minIndex(numbers, iter, iterEnd);
std::swap(*iter, *minNum);
}
}
template<typename Container, typename Iter>
Iter minIndex(const Container& numbers, Iter start, Iter end)
{
Iter minIdx = start;
auto minNum = *start;
while (++start != end)
{
if (*start < minNum)
{
minNum = *start;
minIdx = start;
}
}
return minIdx;
}
Insertion Sort:
template<typename Container>
void insertionSort(Container& numbers)
{
for (auto iter = std::begin(numbers) + 1, iterEnd = std::end(numbers); iter != iterEnd; ++iter)
{
if (*iter < *(iter-1))
{
resort(numbers, iter);
}
}
}
template<typename Container, typename Iter>
void resort(Container& numbers, Iter containerIter)
{
auto temp = *containerIter;
while (containerIter != std::begin(numbers) && temp < *(containerIter-1))
{
*containerIter = *(containerIter - 1);
--containerIter;
}
*containerIter = temp;
}