mfgnik

Untitled

May 17th, 2020
760
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. template <typename InputIteratorFirst, typename InputIteratorSecond,
  2. typename OutputIterator, typename Comparator>
  3. OutputIterator Merge(InputIteratorFirst begin_first_iter, InputIteratorFirst end_first_iter,
  4.                InputIteratorSecond begin_second_iter, InputIteratorSecond end_second_iter,
  5.                OutputIterator buffer_iter, Comparator comparator) {
  6.     while (begin_first_iter != end_first_iter && begin_second_iter != end_second_iter) {
  7.         if (comparator(*begin_first_iter, *begin_second_iter)) {
  8.             *buffer_iter++ = *begin_first_iter++;
  9.         } else {
  10.             *buffer_iter++ = *begin_second_iter++;
  11.         }
  12.     }
  13.     buffer_iter = std::move(begin_first_iter, end_first_iter, buffer_iter);
  14.     return std::move(begin_second_iter, end_second_iter, buffer_iter);
  15. }
  16.  
  17.  
  18. template <typename Iterator, typename Comparator>
  19. void MergeSort(Iterator begin, Iterator end, Iterator begin_buffer_iter, Comparator comparator) {
  20.     auto distance = std::distance(begin, end);
  21.     if (distance < 2) {
  22.         return;
  23.     }
  24.     auto middle = begin + distance / 2;
  25.     MergeSort(begin, middle, begin_buffer_iter, comparator);
  26.     MergeSort(middle, end, begin_buffer_iter, comparator);
  27.     auto end_buffer_iter = Merge(begin, middle, middle, end, begin_buffer_iter, comparator);
  28.     std::move(begin_buffer_iter, end_buffer_iter, begin);
  29. }
  30.  
  31.  
  32. template <typename Iterator, typename Comparator>
  33. void MergeSort(Iterator begin, Iterator end, Comparator comparator) {
  34.     using ValueType = typename std::iterator_traits<Iterator>::value_type;
  35.     std::vector<ValueType> buffer;
  36.     buffer.reserve(std::distance(begin, end));
  37.     MergeSort(begin, end, buffer.begin(), comparator);
  38. }
Advertisement
Add Comment
Please, Sign In to add comment