Advertisement
Korotkodul

QuickSort_v2

Sep 30th, 2023 (edited)
731
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. #include <cmath>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using std::cin;
  6. using std::cout;
  7. using std::max;
  8. using std::min;
  9. using std::string;
  10. using std::vector;
  11.  
  12. bool sh = 1;
  13.  
  14. void swap(int* p1, int* p2) {
  15.   int t = *p1;
  16.   *p1 = *p2;
  17.   *p2 = t;
  18. }
  19.  
  20.  
  21. vector<int> Partition(vector<int> aa, int xx) {
  22.   //делим на < и >=
  23.   int nn = aa.size();
  24.   int ll = -1;
  25.   for (int ii = 0; ii < nn; ++ii) {
  26.     if (aa[ii] < xx) {
  27.       int* p1 = &aa[ii];
  28.       int* p2 = &aa[ll + 1];
  29.       swap(p1, p2);
  30.       ll++;
  31.     }
  32.   }
  33.   //делим на = и >
  34.   for (int ii = ll + 1; ii < nn; ++ii) {
  35.     if (aa[ii] == xx) {
  36.       int* p1 = &aa[ii];
  37.       int* p2 = &aa[ll + 1];
  38.       swap(p1, p2);
  39.       ll++;
  40.     }
  41.   }
  42.   return aa;
  43. }
  44.  
  45. int get_med(vector<int> vv) {
  46.   for (int ii = 0; ii < 5; ++ii) {
  47.     for (int jj = 0; jj < 4; ++jj) {
  48.       if (vv[jj] > vv[jj + 1]) {
  49.         int* p1 = &vv[jj];
  50.         int* p2 = &vv[jj + 1];
  51.         swap(p1, p2);
  52.       }
  53.     }
  54.   }
  55.   return vv[2];
  56. }
  57.  
  58. int inf = 2e9;
  59.  
  60. vector<int> DQS(vector<int> aa);
  61.  
  62. int QuickSelect(vector<int> med) {
  63.   while (med.size() % 5 != 0) {
  64.     med.push_back(inf);
  65.   }
  66.   vector<int> new_med;
  67.   for (int ii = 0; ii < med.size(); ii += 5) {
  68.     vector<int> vv = {med[ii], med[ii + 1], med[ii + 2], med[ii + 3], med[ii + 4]};
  69.     new_med.push_back(vv[2]);
  70.   }
  71.   if (new_med.size() == 1) {
  72.     return new_med[0];
  73.   }
  74.   new_med = DQS(new_med);
  75.   int res = QuickSelect(new_med);
  76.   return res;
  77. }
  78.  
  79. vector<int> DQS(vector <int> aa) {
  80.     if (sh) {
  81.       cout << "DQS\n";
  82.       cout << "aa\n";
  83.       for (int ii: aa) {
  84.         cout << ii << ' ';
  85.       }
  86.       cout << "\n";
  87.     }
  88.     int piv = QuickSelect(aa);
  89.     aa = Partition(aa, piv);
  90.     if (sh) {
  91.       cout << "piv = " << piv << "\n";
  92.       cout << "aa\n";
  93.       for (int ii: aa) {
  94.         cout << ii << ' ';
  95.       }
  96.       cout << "\n";
  97.     }
  98.     vector<int> bb; //<piv
  99.     vector<int> cc; //==piv
  100.     vector<int> dd; //>piv
  101.     for (int ii: aa) {
  102.       if (ii < piv) {
  103.         bb.push_back(ii);
  104.       } else if (ii == piv) {
  105.         cc.push_back(ii);
  106.       } else {
  107.         dd.push_back(ii);
  108.       }
  109.     }
  110.     bb = DQS(bb);
  111.     dd = DQS(dd);
  112.     vector<int> res;
  113.     for (int ii: bb) {
  114.       res.push_back(ii);
  115.     }
  116.     for (int ii: cc) {
  117.       res.push_back(ii);
  118.     }
  119.     for (int ii: dd) {
  120.       res.push_back(ii);
  121.     }
  122.     return res;
  123.     if (sh) {
  124.       cout << "res\n";
  125.       for (int ii: res) {
  126.         cout << ii << ' ';
  127.       }
  128.       cout << "\n";
  129.     }
  130. }
  131.  
  132.  
  133.  
  134.  
  135.  
  136. int main() {
  137.   /*std::ios::sync_with_stdio(false);
  138.   std::cin.tie(0);
  139.   std::cout.tie(0);*/
  140.   int nn;
  141.   cin >> nn;
  142.   vector<int> aa(nn);
  143.   for (int& ii: aa) {
  144.     cin >> ii;
  145.   }
  146.   if (sh) {
  147.     cout << "BEGIN SORT\n";
  148.   }
  149.   aa = DQS(aa);
  150.   if (sh) {
  151.     cout << "SORTED aa\n";
  152.   }
  153.   for (int ii: aa) {
  154.     cout << ii << ' ';
  155.   }
  156.   cout << "\n";
  157. }
  158. /*
  159. 17
  160. 2 2 0 2 1 2 0 2 1 0 2 1 2 2 0 0 2
  161. */
  162.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement