Al3XS0n

Untitled

Oct 28th, 2020
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.36 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <iterator>
  4. #include <functional>
  5.  
  6. template<typename Iter>
  7. using iter_vt = typename std::iterator_traits<Iter>::value_type;
  8.  
  9. template<typename Iter, typename Comp>
  10. iter_vt<Iter> pivot(Iter begin, Iter end, Comp cmp){
  11. auto mid = (begin + end) / 2;
  12. auto lst = end - 1;
  13.  
  14. if (cmp(*mid,*begin)) {
  15. std::swap(*begin, *mid);
  16. }
  17. if (cmp(*mid,*lst)) {
  18. std::swap(*mid, *lst);
  19. }
  20. if (cmp(*lst,*begin)){
  21. std::swap(*begin, *lst);
  22. }
  23.  
  24. return *lst;
  25. }
  26.  
  27. template<typename Iter, typename Comp>
  28. Iter qsort_partition(Iter beg, Iter end, Comp cmp){
  29. iter_vt<Iter> pivot = qsort_pivot(beg, end, cmp);
  30.  
  31. Iter pos = beg;
  32. for(; beg != end-1; ++beg){
  33. if(cmp(*beg, pivot)){
  34. std::swap(*pos, *beg);
  35. ++pos;
  36. }
  37. }
  38. std::swap(*pos, *(end-1));
  39.  
  40. return pos;
  41. }
  42.  
  43. template<typename Iter, typename Comp = std::less<iter_vt<Iter>>>
  44. void Sort(Iter beg, Iter end, Comp cmp = std::less<iter_vt<Iter>>{}){
  45. if(std::distance(beg,end) < 2)
  46. return;
  47.  
  48. Iter mid = qsort_partition(beg,end,cmp);
  49.  
  50. Sort(beg , mid, cmp);
  51. Sort(mid+1, end, cmp);
  52. }
  53.  
  54. template<typename T, typename Comp = std::less<T>>
  55. void Sort(std::vector<T>* pv, Comp cmp = std::less<T>{}){
  56. Sort(pv->begin(), pv->end(), cmp);
  57. }
Advertisement
Add Comment
Please, Sign In to add comment