Files
DSA/sorting/quicksort.cpp
2024-10-04 16:11:55 -05:00

76 lines
2.1 KiB
C++

#include "quicksort.hpp"
#include "utils.hpp"
#include <iostream>
#include <vector>
#include <cassert>
#include <algorithm>
namespace
{
template <std::random_access_iterator T>
T quicksort_partition(T begin, T end, const std::function<bool(decltype(*std::declval<T>()), decltype(*std::declval<T>()))> comparer)
{
std::cout << "part: " << *begin << std::endl;
assert(begin != end);
// using difftype = decltype(std::declval<T>() - std::declval<T>());
const T piv = std::next(end, -1);
T swapIfLesser = begin;
while (swapIfLesser != piv && comparer(*swapIfLesser, *piv))
{
swapIfLesser = std::next(swapIfLesser);
}
swapIfLesser = std::next(swapIfLesser);
T active = std::next(swapIfLesser);
while (active != piv)
{
if (comparer(*active, *piv))
{
std::iter_swap(swapIfLesser, active);
swapIfLesser = std::next(swapIfLesser);
}
active = std::next(active);
}
const T pivFinal = std::next(swapIfLesser);
std::iter_swap(pivFinal, piv);
return pivFinal;
}
}
template <std::random_access_iterator T>
void quicksort(T begin, T end, std::function<bool(decltype(*std::declval<T>()), decltype(*std::declval<T>()))> comparer)
{
if (begin != end)
{
auto pivot = quicksort_partition(begin, end, comparer);
quicksort(begin, pivot);
quicksort(std::next(pivot), end);
}
}
template <std::random_access_iterator T>
void quicksort(T begin, T end)
{
const auto comparer = [](decltype(*std::declval<T>()) f, decltype(*std::declval<T>()) s){ return f < s; };
quicksort(begin, end, comparer);
}
int main()
{
//last value is to find OOB
std::vector<int32_t> vec{12345, 1,5,3,2,5,7,9,-3,12,0, 9999};
arrayprint(vec.begin()+1, vec.end()-1);
std::cout << std::endl;
quicksort(vec.begin()+1, vec.end()-1);
arrayprint(vec.begin()+1, vec.end()-1);
std::cout << std::endl;
std::cout << std::endl;
std::vector<int32_t> vec2;
arrayprint(vec2.begin(), vec2.end());
std::cout << std::endl;
quicksort(vec2.begin(), vec2.end());
arrayprint(vec2.begin(), vec2.end());
std::cout << std::endl;
return 0;
}