#include <algorithm>
#include <iterator>
#include <functional>

template <typename T>
void qsort(T begin, T end)
{
  if (begin != end)
    {
      T middle = partition(begin, end, bind2nd(less<iterator_traits<T>::value_type>(), *begin))
      qsort(begin, middle);
      qsort(max(begin + 1, middle), end);
    }
}

Some scaffolding code for testing:

#include <iostream>
int main()
{
  int lst[] = {1, 3, 2, 1, 2, 3, 4, 1, 0};
  int sz = sizeof(lst) / sizeof(int);
  qsort(lst, lst + sz);
  copy(lst, lst + sz, ostream_iterator<int>(cout, " "));
  return 0;
}