Advertisement
Guest User

Merge

a guest
Oct 24th, 2014
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <iterator>
  4. #include <chrono>
  5. #include <ctime>
  6. #include <vector>
  7. #include <cmath>
  8. #include <typeinfo>
  9.  
  10. using namespace std;
  11.  
  12. template < typename FSourceIterator, typename SSourceIterator,
  13. typename TargetIterator >
  14.  
  15. TargetIterator Merge(FSourceIterator first_begin, FSourceIterator first_end,
  16.                      SSourceIterator second_begin, SSourceIterator second_end,
  17.                      TargetIterator target) {
  18.     while (first_begin != first_end &&
  19.            second_begin != second_end) {
  20.         if(*first_begin <= *second_begin) {
  21.             //*(target++) = *(first_begin++);
  22.             *target = *first_begin;
  23.             ++target;
  24.             ++first_begin;
  25.         }
  26.         else {
  27.             //*(target++) = *(second_begin++);
  28.             *target = *second_begin;
  29.             ++target;
  30.             ++second_begin;
  31.         }
  32.     }
  33.     target = std::copy(first_begin, first_end, target);
  34.     target = std::copy(second_begin, second_end, target);
  35.     return target;
  36. }
  37.  
  38. template <typename Iterator>
  39. void Sort(Iterator begin, Iterator end) {
  40.     std::vector<typename std::iterator_traits<Iterator>::value_type> buffer(end - begin);
  41.     for(size_t chunk_size = 1; chunk_size < end - begin; chunk_size *= 2) {
  42.         auto target = buffer.begin();
  43.         for(Iterator first_begin = begin;
  44.             first_begin < end;
  45.             first_begin += std::min<size_t>(2 * chunk_size, end - first_begin)) {
  46.             Iterator second_begin = first_begin + std::min<size_t>(chunk_size, end - first_begin);
  47.             Iterator second_end = second_begin + std::min<size_t>(chunk_size, end - second_begin);
  48.             target = Merge(first_begin, second_begin, second_begin, second_end, target);
  49.         }
  50.         std::copy(buffer.begin(), buffer.end(), begin);
  51.     }
  52. }
  53.  
  54. int main() {
  55.     vector <int> really1, really2;
  56.     int n; cin >> n;
  57.     srand(time(0));
  58.     for(int i = 0; i < n; i++) {
  59.         int x;
  60.         x = rand() % 10 + 1;
  61.         really1.push_back(x);
  62.     }
  63.     vector <int> target(really1.size() + really2.size());
  64.     auto start = std::chrono::steady_clock::now();
  65.     sort(really1.begin(), really1.end());
  66.     auto end = std::chrono::steady_clock::now();
  67.     //for(int i = 0; i < really1.size(); i++) cout << really1[i] << " ";
  68.     cout << endl << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() * 0.000001 << " seconds";
  69.     return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement