Advertisement
Korotkodul

QuickSort_v11_TL

Sep 30th, 2023
1,016
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.91 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 = false;
  13.  
  14. void Swap(int* p1, int* p2) {
  15.   int tt = *p1;
  16.   *p1 = *p2;
  17.   *p2 = tt;
  18. }
  19.  
  20. vector<int> Partition(vector<int> aa, int xx) {
  21.   // делим на < и >=
  22.   int nn = aa.size();
  23.   int ll = -1;
  24.   for (int ii = 0; ii < nn; ++ii) {
  25.     if (aa[ii] < xx) {
  26.       int* p1 = &aa[ii];
  27.       int* p2 = &aa[ll + 1];
  28.       Swap(p1, p2);
  29.       ll++;
  30.     }
  31.   }
  32.   // делим на = и >
  33.   for (int ii = ll + 1; ii < nn; ++ii) {
  34.     if (aa[ii] == xx) {
  35.       int* p1 = &aa[ii];
  36.       int* p2 = &aa[ll + 1];
  37.       Swap(p1, p2);
  38.       ll++;
  39.     }
  40.   }
  41.   return aa;
  42. }
  43.  
  44. int GetMed(vector<int> vv) {
  45.   for (int ii = 0; ii < 5; ++ii) {
  46.     for (int jj = 0; jj < 4; ++jj) {
  47.       if (vv[jj] > vv[jj + 1]) {
  48.         int* p1 = &vv[jj];
  49.         int* p2 = &vv[jj + 1];
  50.         Swap(p1, p2);
  51.       }
  52.     }
  53.   }
  54.   /*if (sh) {
  55.     cout << "vv sorted\n";
  56.     for (int ii: vv) {
  57.       cout << ii << ' ';
  58.     }
  59.     cout << "\n\n";
  60.   }*/
  61.   return vv[2];
  62. }
  63.  
  64. vector<int> DQS(vector<int> aa);
  65.  
  66. int QuickSelect(vector<int> med, int cnt) {
  67.   constexpr int kInfin = 2e9;
  68.   while (med.size() % 5 != 0) {
  69.     med.push_back(kInfin);
  70.   }
  71.   if (sh) {
  72.     cout << "QuickSelect\n";
  73.     cout << "med\n";
  74.     for (int ii : med) {
  75.       cout << ii << ' ';
  76.     }
  77.     cout << "\n";
  78.   }
  79.  
  80.   vector<int> new_med;
  81.   for (int ii = 0; ii < (int)med.size(); ii += 5) {
  82.     vector<int> vv = {med[ii], med[ii + 1], med[ii + 2], med[ii + 3],
  83.                       med[ii + 4]};
  84.     int kk = GetMed(vv);
  85.     new_med.push_back(kk);
  86.   }
  87.   if (new_med.size() == 1) {
  88.     return new_med[0];
  89.   }
  90.   if (new_med.size() == 2) {
  91.     if (new_med[0] != kInfin) {
  92.       return new_med[0];
  93.     }
  94.     return new_med[1];
  95.   }
  96.   if (new_med.size() <= 5) {
  97.     for (int ii : new_med) {
  98.       if (ii != kInfin) {
  99.         return ii;
  100.       }
  101.     }
  102.     return new_med[2];
  103.   }
  104.   if (sh) {
  105.     cout << "new_med\n";
  106.     for (int ii : new_med) {
  107.       cout << ii << ' ';
  108.     }
  109.     cout << "\n\n";
  110.   }
  111.   new_med = DQS(new_med);
  112.   int res;
  113.   if (cnt == 2) {
  114.     int tt = new_med.size();
  115.     res = new_med[tt / 2];
  116.     return res;
  117.   }
  118.   res = QuickSelect(new_med, cnt + 1);
  119.   if (sh) {
  120.     cout << "QuickSelect res = " << res << "\n\n";
  121.   }
  122.   return res;
  123. }
  124.  
  125. vector<int> DQS(vector<int> aa) {
  126.   if (aa.size() == 1) {
  127.     return aa;
  128.   }
  129.   if (aa.size() == 2) {
  130.     return {min(aa[0], aa[1]), max(aa[0], aa[1])};
  131.   }
  132.   int piv = QuickSelect(aa, 1);
  133.   aa = Partition(aa, piv);
  134.   if (sh) {
  135.     cout << "PERTITION DONE\n";
  136.     cout << "piv = " << piv << "\n";
  137.     cout << "aa\n";
  138.     for (int ii : aa) {
  139.       cout << ii << ' ';
  140.     }
  141.     cout << "\n\n";
  142.   }
  143.   vector<int> bb;  //<piv
  144.   vector<int> cc;  //==piv
  145.   vector<int> dd;  //>piv
  146.   for (int ii : aa) {
  147.     if (ii < piv) {
  148.       bb.push_back(ii);
  149.     } else if (ii == piv) {
  150.       cc.push_back(ii);
  151.     } else {
  152.       dd.push_back(ii);
  153.     }
  154.   }
  155.   if (!bb.empty()) {
  156.     bb = DQS(bb);
  157.   }
  158.   if (!dd.empty()) {
  159.     dd = DQS(dd);
  160.   }
  161.   vector<int> res;
  162.   for (int ii : bb) {
  163.     res.push_back(ii);
  164.   }
  165.   for (int ii : cc) {
  166.     res.push_back(ii);
  167.   }
  168.   for (int ii : dd) {
  169.     res.push_back(ii);
  170.   }
  171.   return res;
  172.   if (sh) {
  173.     cout << "res\n";
  174.     for (int ii : res) {
  175.       cout << ii << ' ';
  176.     }
  177.     cout << "\n";
  178.   }
  179. }
  180.  
  181. int main() {
  182.   /*std::ios::sync_with_stdio(false);
  183.   std::cin.tie(0);
  184.   std::cout.tie(0);*/
  185.   int nn;
  186.   cin >> nn;
  187.   vector<int> aa(nn);
  188.   for (int& ii : aa) {
  189.     cin >> ii;
  190.   }
  191.   if (sh) {
  192.     cout << "BEGIN SORT\n";
  193.   }
  194.   aa = DQS(aa);
  195.   if (sh) {
  196.     cout << "SORTED aa\n";
  197.   }
  198.   for (int ii : aa) {
  199.     cout << ii << ' ';
  200.   }
  201.   cout << "\n";
  202. }
  203. /*
  204. 17
  205. 2 2 0 2 1 2 0 2 1 0 2 1 2 2 0 0 2
  206.  
  207. 16
  208. 7 10 3 4 5 11 2 1 2 3 1 5 4 6 7 1
  209. */
  210.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement