Trochę za bardzo skomplikowałeś funkcję selection. Za dużo niepotrzebnych zmiennych oraz nie za bardzo dobrane nazwy funkcji. Zobacz jak może to wyglądać w uproszczeniu,
#include <iostream>
#include <vector>
using namespace std;
template< typename T >
void print( const vector<T>& data )
{
for( const auto& element : data )
{
cout << element << " ";
}
cout << endl;
}
template< typename T >
void sort_verbose( vector<T>& data )
{
print(data);
size_t min {0};
for( size_t i {0} ; i<data.size() ; ++i )
{
for( size_t j {i+1} ; j<data.size() ; ++j )
{
if( data[min] > data[j] ) min=j;
}
if( i != min )
{
swap(data[i],data[min]);
print(data);
}
}
}
int main()
{
std::vector<int> data {5,6,10,-4,12,776,43,0,-8};
sort_verbose(data);
return 0;
}