In my last article have seen how we can leverage C++ STL to do selection sort on the vector of integers only. However, the selection sort wasn't very generic to accept vectors of any basic type and sort accordingly.
The below program was an effort to make the same selection sort (ascending order) implementation for vectors of any type like vectors of integers, doubles, chars, etc.
#include < iostream >
#include < algorithm >
#include < vector >
template < class ForwardIterator1, class ForwardIterator2 >
void iters_swap (ForwardIterator1 a, ForwardIterator2 b)
{
std::swap (*a, *b);
}
template < typename T >
void selectionSort(std::vector< T > &v)
{
// Selection sort
typedef typename std::vector::value_type vt;
typename std::vector::iterator it = v.begin();
while(it != v.end())
{
typename std::vector::iterator i_Min = std::min_element(it, v.end());
iters_swap(i_Min, it);
++it;
}
}
int main()
{
// Case 1: Vector of ints
int arr[] = {34, 20, 99, 10, 23};
std::vector v(std::begin(arr), std::end(arr));
// Before sorting
for (std::vector::const_iterator i = v.begin(); i != v.end(); ++i)
{
std::cout << *i << ' ';
}
std::cout << std::endl;
selectionSort(v);
// After sorting
for (std::vector::const_iterator iSort = v.begin(); iSort != v.end(); ++iSort)
{
std::cout << *iSort << ' ';
}
std::cout << std::endl;
// Case 2: Vector of doubles
double arrd[] = {23.23, 19.01, 19, 5.04, 15.56, 23};
std::vector vd(std::begin(arrd), std::end(arrd));
// Before sorting
for (std::vector::const_iterator i = vd.begin(); i != vd.end(); ++i)
{
std::cout << *i << ' ';
}
std::cout << std::endl;
selectionSort(vd);
// After sorting
for (std::vector::const_iterator iSort = vd.begin(); iSort != vd.end(); ++iSort)
{
std::cout << *iSort << ' ';
}
std::cout << std::endl;
// Case 3: Vector of chars
char carr[] = {'c','z','w','f','n','p','g'};
std::vector vc(std::begin(carr), std::end(carr));
// Before sorting
for (std::vector::const_iterator i = vc.begin(); i != vc.end(); ++i)
{
std::cout << *i << ' ';
}
std::cout << std::endl;
selectionSort(vc);
// After sorting
for (std::vector::const_iterator iSort = vc.begin(); iSort != vc.end(); ++iSort)
{
std::cout << *iSort << ' ';
}
std::cout << std::endl;
return 0;
}
Output:
Note: The highlighted STL function std::min_element(), sorts the vector in ascending order. If we want to sort it in descending order, replace std::min_element() with std::max_element(). That's it.
The below program was an effort to make the same selection sort (ascending order) implementation for vectors of any type like vectors of integers, doubles, chars, etc.
#include < iostream >
#include < algorithm >
#include < vector >
template < class ForwardIterator1, class ForwardIterator2 >
void iters_swap (ForwardIterator1 a, ForwardIterator2 b)
{
std::swap (*a, *b);
}
template < typename T >
void selectionSort(std::vector< T > &v)
{
// Selection sort
typedef typename std::vector
typename std::vector
while(it != v.end())
{
typename std::vector
iters_swap(i_Min, it);
++it;
}
}
int main()
{
// Case 1: Vector of ints
int arr[] = {34, 20, 99, 10, 23};
std::vector
// Before sorting
for (std::vector
{
std::cout << *i << ' ';
}
std::cout << std::endl;
selectionSort(v);
// After sorting
for (std::vector
{
std::cout << *iSort << ' ';
}
std::cout << std::endl;
// Case 2: Vector of doubles
double arrd[] = {23.23, 19.01, 19, 5.04, 15.56, 23};
std::vector
// Before sorting
for (std::vector
{
std::cout << *i << ' ';
}
std::cout << std::endl;
selectionSort(vd);
// After sorting
for (std::vector
{
std::cout << *iSort << ' ';
}
std::cout << std::endl;
// Case 3: Vector of chars
char carr[] = {'c','z','w','f','n','p','g'};
std::vector
// Before sorting
for (std::vector
{
std::cout << *i << ' ';
}
std::cout << std::endl;
selectionSort(vc);
// After sorting
for (std::vector
{
std::cout << *iSort << ' ';
}
std::cout << std::endl;
return 0;
}
Output:
Note: The highlighted STL function std::min_element(), sorts the vector in ascending order. If we want to sort it in descending order, replace std::min_element() with std::max_element(). That's it.
Comments