Advertisement
Korotkodul

QuickSort_v9

Sep 30th, 2023
787
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 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.  
  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 GetMed(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.   /*if (sh) {
  56.     cout << "vv sorted\n";
  57.     for (int ii: vv) {
  58.       cout << ii << ' ';
  59.     }
  60.     cout << "\n\n";
  61.   }*/
  62.   return vv[2];
  63. }
  64.  
  65.  
  66. vector<int> DQS(vector<int> aa);
  67.  
  68. int QuickSelect(vector<int> med) {
  69.   constexpr int kInfin = 2e9;
  70.   while (med.size() % 5 != 0) {
  71.     med.push_back(kInfin);
  72.   }
  73.   if (sh) {
  74.     cout << "QuickSelect\n";
  75.     cout << "med\n";
  76.     for (int ii: med) {
  77.       cout << ii << ' ';
  78.     }
  79.     cout << "\n";
  80.   }
  81.  
  82.   vector<int> new_med;
  83.   for (int ii = 0; ii < med.size(); ii += 5) {
  84.     vector<int> vv = {med[ii], med[ii + 1], med[ii + 2], med[ii + 3], med[ii + 4]};
  85.     int kk = GetMed(vv);
  86.     new_med.push_back(kk);
  87.   }
  88.   if (new_med.size() == 1) {
  89.     return new_med[0];
  90.   }
  91.   if (new_med.size() == 2) {
  92.     if (new_med[0] != kInfin) {
  93.       return new_med[0];
  94.     }
  95.     return new_med[1];
  96.   }
  97.   if (new_med.size() <= 5) {
  98.       for (int ii: new_med) {
  99.         if (ii != kInfin) {
  100.           return ii;
  101.         }
  102.       }
  103.       return new_med[2];
  104.   }
  105.   if (sh) {
  106.     cout << "new_med\n";
  107.     for (int ii: new_med) {
  108.       cout << ii << ' ';
  109.     }
  110.     cout << "\n\n";
  111.   }
  112.   new_med = DQS(new_med);
  113.   int res = QuickSelect(new_med);
  114.   if (sh) {
  115.     cout << "QuickSelect res = " << res << "\n\n";
  116.   }
  117.   return res;
  118. }
  119.  
  120. vector<int> DQS(vector<int> aa) {
  121.     constexpr int kInfin = 2e9;
  122.     if (aa.size() == 1) {
  123.       return aa;
  124.     }
  125.     if (aa.size() == 2) {
  126.       return {min(aa[0], aa[1]), max(aa[0], aa[1])};
  127.     }
  128.     if (sh) {
  129.       cout << "DQS\n";
  130.       cout << "aa\n";
  131.       for (int ii: aa) {
  132.         cout << ii << ' ';
  133.       }
  134.       cout << "\n";
  135.     }
  136.     int piv = QuickSelect(aa);
  137.     aa = Partition(aa, piv);
  138.     if (sh) {
  139.       cout << "PERTITION DONE\n";
  140.       cout << "piv = " << piv << "\n";
  141.       cout << "aa\n";
  142.       for (int ii: aa) {
  143.         cout << ii << ' ';
  144.       }
  145.       cout << "\n\n";
  146.     }
  147.     vector<int> bb; //<piv
  148.     vector<int> cc; //==piv
  149.     vector<int> dd; //>piv
  150.     for (int ii: aa) {
  151.       if (ii < piv) {
  152.         bb.push_back(ii);
  153.       } else if (ii == piv) {
  154.         cc.push_back(ii);
  155.       } else {
  156.         dd.push_back(ii);
  157.       }
  158.     }
  159.     if (!bb.empty()) {
  160.       bb = DQS(bb);
  161.     }
  162.     if (!dd.empty()) {
  163.       dd = DQS(dd);
  164.     }
  165.     vector<int> res;
  166.     for (int ii: bb) {
  167.       res.push_back(ii);
  168.     }
  169.     for (int ii: cc) {
  170.       res.push_back(ii);
  171.     }
  172.     for (int ii: dd) {
  173.       res.push_back(ii);
  174.     }
  175.     return res;
  176.     if (sh) {
  177.       cout << "res\n";
  178.       for (int ii: res) {
  179.         cout << ii << ' ';
  180.       }
  181.       cout << "\n";
  182.     }
  183. }
  184.  
  185.  
  186.  
  187.  
  188.  
  189. int main() {
  190.   /*std::ios::sync_with_stdio(false);
  191.   std::cin.tie(0);
  192.   std::cout.tie(0);*/
  193.   int nn;
  194.   cin >> nn;
  195.   vector<int> aa(nn);
  196.   for (int& ii: aa) {
  197.     cin >> ii;
  198.   }
  199.   if (sh) {
  200.     cout << "BEGIN SORT\n";
  201.   }
  202.   aa = DQS(aa);
  203.   if (sh) {
  204.     cout << "SORTED aa\n";
  205.   }
  206.   for (int ii: aa) {
  207.     cout << ii << ' ';
  208.   }
  209.   cout << "\n";
  210. }
  211. /*
  212. 17
  213. 2 2 0 2 1 2 0 2 1 0 2 1 2 2 0 0 2
  214.  
  215. 16
  216. 7 10 3 4 5 11 2 1 2 3 1 5 4 6 7 1
  217. */
  218.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement