Advertisement
Korotkodul

QuickSort_v5

Sep 30th, 2023 (edited)
745
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.73 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.   /*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. int inf = 2e9;
  66.  
  67. vector<int> DQS(vector<int> aa);
  68.  
  69. int QuickSelect(vector<int> med) {
  70.   while (med.size() % 5 != 0) {
  71.     med.push_back(inf);
  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 = get_med(vv);
  86.     new_med.push_back(kk);
  87.   }
  88.   if (new_med.size() == 1) {
  89.     return new_med[0];
  90.   } else if (new_med.size() == 2) {
  91.     return new_med[1];
  92.   } else if (new_med.size() <= 5) {
  93.       return new_med[2];
  94.   }
  95.   if (sh) {
  96.     cout << "new_med\n";
  97.     for (int ii: new_med) {
  98.       cout << ii << ' ';
  99.     }
  100.     cout << "\n\n";
  101.   }
  102.   new_med = DQS(new_med);
  103.   int res = QuickSelect(new_med);
  104.   if (sh) {
  105.     cout << "QuickSelect res = " << res << "\n\n";
  106.   }
  107.   return res;
  108. }
  109.  
  110. vector<int> DQS(vector <int> aa) {
  111.     if (aa.size() == 1) {
  112.       return aa;
  113.     }
  114.     if (aa.size() == 2) {
  115.       return {min(aa[0], aa[1]), max(aa[0], aa[1])};
  116.     }
  117.     if (sh) {
  118.       cout << "DQS\n";
  119.       cout << "aa\n";
  120.       for (int ii: aa) {
  121.         cout << ii << ' ';
  122.       }
  123.       cout << "\n";
  124.     }
  125.     int piv = QuickSelect(aa);
  126.     aa = Partition(aa, piv);
  127.     if (sh) {
  128.       cout << "PERTITION DONE\n";
  129.       cout << "piv = " << piv << "\n";
  130.       cout << "aa\n";
  131.       for (int ii: aa) {
  132.         cout << ii << ' ';
  133.       }
  134.       cout << "\n\n";
  135.     }
  136.     vector<int> bb; //<piv
  137.     vector<int> cc; //==piv
  138.     vector<int> dd; //>piv
  139.     for (int ii: aa) {
  140.       if (ii < piv) {
  141.         bb.push_back(ii);
  142.       } else if (ii == piv) {
  143.         cc.push_back(ii);
  144.       } else {
  145.         dd.push_back(ii);
  146.       }
  147.     }
  148.     bb = DQS(bb);
  149.     dd = DQS(dd);
  150.     vector<int> res;
  151.     for (int ii: bb) {
  152.       res.push_back(ii);
  153.     }
  154.     for (int ii: cc) {
  155.       res.push_back(ii);
  156.     }
  157.     for (int ii: dd) {
  158.       res.push_back(ii);
  159.     }
  160.     return res;
  161.     if (sh) {
  162.       cout << "res\n";
  163.       for (int ii: res) {
  164.         cout << ii << ' ';
  165.       }
  166.       cout << "\n";
  167.     }
  168. }
  169.  
  170.  
  171.  
  172.  
  173.  
  174. int main() {
  175.   /*std::ios::sync_with_stdio(false);
  176.   std::cin.tie(0);
  177.   std::cout.tie(0);*/
  178.   int nn;
  179.   cin >> nn;
  180.   vector<int> aa(nn);
  181.   for (int& ii: aa) {
  182.     cin >> ii;
  183.   }
  184.   if (sh) {
  185.     cout << "BEGIN SORT\n";
  186.   }
  187.   aa = DQS(aa);
  188.   if (sh) {
  189.     cout << "SORTED aa\n";
  190.   }
  191.   for (int ii: aa) {
  192.     cout << ii << ' ';
  193.   }
  194.   cout << "\n";
  195. }
  196. /*
  197. 17
  198. 2 2 0 2 1 2 0 2 1 0 2 1 2 2 0 0 2
  199. */
  200.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement