Advertisement
Korotkodul

QuickSort_v4

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