Advertisement
shek_shek

Class Sorts

Oct 10th, 2014
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.67 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stack>
  3. #include<math.h>
  4. #include<time.h>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<string>
  8. #include<set>
  9. #include<iomanip>
  10. #include<vector>
  11. #include<map>
  12. #include<cassert>
  13. #include<queue>
  14. #include <tuple>
  15.  
  16. using namespace std;
  17.  
  18. typedef long long li;
  19. typedef long double ld;
  20.  
  21. #define forn(i, n) for (int i = 0; i < int(n); ++i)
  22. #define pb push_back
  23. #define mp make_pair
  24. #define shek_shek _DEBUG
  25. #define all(v) v.begin(),v.end()
  26. #define EPS 1e-9
  27. #define PI 3.1415926535897932384626433832795
  28.  
  29. const int N = 50001;
  30.  
  31. template <typename T> class Sort {
  32. public:
  33.     virtual void sort(T* t_array, int array_size) = 0;
  34.     virtual const string get_name() = 0;
  35. };
  36.  
  37. template <typename T> class StdSort {
  38. public:
  39.     void sort(T* sort_array, int sort_array_size) {
  40.         std::sort(sort_array, sort_array + sort_array_size);
  41.     }
  42.  
  43.     void get_name () {
  44.         return "StdSort";
  45.     }
  46. };
  47.  
  48. template <typename T> class HeapSort  {
  49. private:
  50.  
  51.     T* t_array;
  52.     int array_size;
  53.  
  54.     void heapify (int i) {
  55.         while (2 * i + 1 < array_size) {
  56.             int j = 2 * i + 1;
  57.             if (j + 1 < array_size && t_array[j + 1] > t_array[j])
  58.                 j++;
  59.             if (t_array[i] >= t_array[j])
  60.                 break;
  61.             swap(t_array[i], t_array[j]);
  62.             i = j;
  63.         }
  64.     }
  65.  
  66.     void heapSort () {
  67.         for (int i = array_size - 1; i >= 0; i--)
  68.             heapify(i);
  69.         while (array_size > 1) {
  70.             swap(t_array[0], t_array[array_size - 1]);
  71.             array_size--;
  72.             heapify(0);
  73.         }
  74.     }
  75. public:
  76.     void sort(T* sort_array, int sort_array_size) {
  77.         this->t_array = sort_array;
  78.         this->array_size = sort_array_size;
  79.         heapSort();
  80.     }
  81.  
  82.     string get_name() {
  83.         return "HeapSort";
  84.     }
  85. };
  86.  
  87. template <typename T> class MergeSort {
  88. private:
  89.  
  90.     T* a;
  91.     int array_size;
  92.     T* b;
  93.  
  94.     void merge (int l1, int r1, int l2, int r2) {
  95.         printf("%s%d%s%d%s%d%s%d%s", "merging segments [", l1 + 1, ", ", r1 + 1, "] and [", l2 + 1, ", ", r2 + 1, "]\n");
  96.         int i = l1,j = l2, k = l1;
  97.         while (i <= r1 && j <= r2) {
  98.             printf("%s%d%s%d\n","comparing ", a[i], " and ", a[j]);
  99.             if (a[i] <= a[j]) {
  100.                 b[k] = a[i], i++, k++;
  101.             } else {
  102.                 b[k] = a[j], j++, k++;
  103.             }
  104.         }
  105.         while (i <= r1)
  106.             b[k] = a[i], i++, k++;
  107.         while (j <= r2)
  108.             b[k] = a[j], j++, k++;
  109.         for (int i = l1; i <= r2; i++)
  110.             a[i] = b[i];
  111.         printf("%s%d%s%d%s%d%s%d%s", "segments [", l1 + 1, ", ", r1 + 1, "] and [", l2 + 1, ", ", r2 + 1, "] merged\n");
  112.  
  113.     }
  114.  
  115.     void merge_sort (int l, int r) {
  116.         printf("%s%d%s%d%s", "sorting segment [", l + 1, ", ", r + 1, "]\n");
  117.         if (l == r) {
  118.             printf("%s%d%s%d%s", "segment [", l + 1, ", ", r + 1, "] sorted\n");
  119.             return;
  120.         }
  121.         if (l + 1 == r) {
  122.             printf("%s%d%s%d\n","comparing ", a[l], " and ", a[r]);
  123.             if (a[l] > a[r]) {
  124.                 swap(a[l], a[r]);              
  125.                 printf("%s%d%s%d%s", "segment [", l + 1, ", ", r + 1, "] sorted\n");
  126.                 return;
  127.             }
  128.         }
  129.         int mid = (l + r) / 2;
  130.         merge_sort(l, mid);
  131.         merge_sort(mid + 1, r);
  132.         merge(l, mid, mid + 1, r);
  133.         printf("%s%d%s%d%s", "segment [", l + 1, ", ", r + 1, "] sorted\n");
  134.     }
  135.  
  136. public:
  137.  
  138.     void sort (T* sort_array, int sort_array_size) {
  139.         this->a = sort_array;
  140.         this->array_size = sort_array_size;
  141.         this->b = new T[sort_array_size];
  142.         merge_sort(0, sort_array_size - 1);
  143.     }
  144.  
  145.     string get_name () {
  146.         return "MergeSort";
  147.     }
  148.  
  149. };
  150.  
  151. template <typename T> class SortBenchmark {
  152. private:
  153.     int size;
  154.     vector <T*> sorts;
  155.  
  156. public:
  157.  
  158. };
  159.  
  160.  
  161. int n;
  162. int a[N];
  163.  
  164. int main () {
  165. #ifdef shek_shek
  166.     freopen("input.txt", "r", stdin);
  167.     freopen("output.txt", "w", stdout);
  168. #endif
  169.     cin >> n;
  170.     for (int i = 0; i < n; i++)
  171.         cin >> a[i];
  172.  
  173.     MergeSort <int> sortt;
  174.     sortt.sort(a, n);
  175.     cout << "result: ";
  176.     for (int i = 0; i < n; i++)
  177.         printf("%d ", a[i]);
  178.  
  179.     return 0;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement