76 lines
2.1 KiB
C++
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;
|
|
} |