Advertisement
Korotkodul

QuickSort_v3

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