Advertisement
AskTomorrow

Untitled

Feb 14th, 2020
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. int partition(Student *students, Ski *skis, int leftBorder, int rightBorder)
  2. {
  3.     //
  4.     //Student pivot = students[(leftBorder + rightBorder) / 2];
  5.     Student pivot = students[leftBorder + rand()%(rightBorder - leftBorder)];
  6.     Ski pivotSkis;
  7.  
  8.     for (int i = leftBorder; i < rightBorder; ++i)
  9.     {
  10.         if (compare(pivot, skis[i]) == 0) {
  11.             pivotSkis = skis[i];
  12.             break;
  13.         }
  14.     }
  15.  
  16.     //cout << pivotSkis.id << endl;
  17.  
  18.     int idSkis1 = leftBorder;
  19.     int idSkis2 = rightBorder;
  20.  
  21.     while (idSkis1 <= idSkis2)
  22.     {
  23.         while (compare(pivot, skis[idSkis1]) <= 0)
  24.         {
  25.             idSkis1++;
  26.         }
  27.  
  28.         while (compare(pivot, skis[idSkis2]) >= 0)
  29.         {
  30.             idSkis2--;
  31.         }
  32.  
  33.         if (idSkis1 >= idSkis2)
  34.         {
  35.             break;
  36.         }
  37.  
  38.         swap(skis[idSkis1++], skis[idSkis2--]);
  39.     }
  40.  
  41.     int idStudents1 = leftBorder;
  42.     int idStudents2 = rightBorder;
  43.  
  44.     while (idStudents1 <= idStudents2)
  45.     {
  46.         while (compare(students[idStudents1], pivotSkis) <= 0)
  47.         {
  48.             idStudents1++;
  49.         }
  50.  
  51.         while (compare(students[idStudents2], pivotSkis) >= 0)
  52.         {
  53.             idStudents2--;
  54.         }
  55.  
  56.         if (idStudents1 >= idStudents2)
  57.         {
  58.             break;
  59.         }
  60.  
  61.         swap(students[idStudents1++], students[idStudents2--]);
  62.     }
  63.  
  64.     return idSkis2;
  65. }
  66.  
  67.  
  68. /*
  69.  * Если возможно, разделяю массив соответствующим методом, и рекурсивно вызываю текущий метод
  70.  * для двух его частей
  71.  */
  72. void quickSortWithBorders(Student *students, Ski *skis, int leftBorder, int rightBorder)
  73. {
  74.     if (leftBorder < rightBorder)
  75.     {
  76.         int middle = partition(students, skis, leftBorder, rightBorder);
  77.         quickSortWithBorders(students, skis, leftBorder, middle);
  78.         quickSortWithBorders(students, skis, middle + 1, rightBorder);
  79.     }
  80.     else
  81.     {
  82.         return;
  83.     }
  84. }
  85.  
  86. void findPairs(Student* students, Ski* skis, int n)
  87. {
  88.     quickSortWithBorders(students, skis, 0, n - 1);
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement