boyan1324

23401 quick and merge sort

Apr 3rd, 2026
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. int quickSortComparisons = 0;
  8. int mergeSortComparisons = 0;
  9.  
  10. struct Student {
  11.     char name[50];
  12.     double grade;
  13. };
  14.  
  15. // --- MERGE SORT (REVERSE) ---
  16. void mergeReverse(vector<int> &arr, int low, int mid, int high) {
  17.     int n1 = mid - low + 1;
  18.     int n2 = high - mid;
  19.     vector<int> L(n1), R(n2);
  20.     for (int i = 0; i < n1; i++) L[i] = arr[low + i];
  21.     for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j];
  22.  
  23.     int i = 0, j = 0, k = low;
  24.     while (i < n1 && j < n2) {
  25.         mergeSortComparisons++;
  26.         if (L[i] >= R[j]) {
  27.             arr[k++] = L[i++];
  28.         } else {
  29.             arr[k++] = R[j++];
  30.         }
  31.     }
  32.     while (i < n1) arr[k++] = L[i++];
  33.     while (j < n2) arr[k++] = R[j++];
  34. }
  35.  
  36. void mergeSortReverse(vector<int> &arr, int low, int high) {
  37.     if (low >= high) return;
  38.     int mid = low + (high - low) / 2;
  39.     mergeSortReverse(arr, low, mid);
  40.     mergeSortReverse(arr, mid + 1, high);
  41.     mergeReverse(arr, low, mid, high);
  42. }
  43.  
  44. // --- QUICK SORT (REVERSE) ---
  45. int partitionReverse(vector<int> &arr, int low, int high) {
  46.     int pivot = arr[high];
  47.     int i = low - 1;
  48.     for (int j = low; j < high; j++) {
  49.         quickSortComparisons++;
  50.         if (arr[j] >= pivot) {
  51.             i++;
  52.             swap(arr[i], arr[j]);
  53.         }
  54.     }
  55.     swap(arr[i + 1], arr[high]);
  56.     return i + 1;
  57. }
  58.  
  59. void quickSortReverse(vector<int> &arr, int low, int high) {
  60.     if (low < high) {
  61.         int partitionIndex = partitionReverse(arr, low, high);
  62.         quickSortReverse(arr, low, partitionIndex - 1);
  63.         quickSortReverse(arr, partitionIndex + 1, high);
  64.     }
  65. }
  66.  
  67. // --- MERGE SORT (STRINGS) ---
  68. void mergeString(vector<string> &strArr, int low, int mid, int high) {
  69.     int n1 = mid - low + 1;
  70.     int n2 = high - mid;
  71.     vector<string> L(n1), R(n2);
  72.     for (int i = 0; i < n1; i++) L[i] = strArr[low + i];
  73.     for (int j = 0; j < n2; j++) R[j] = strArr[mid + 1 + j];
  74.  
  75.     int i = 0, j = 0, k = low;
  76.     while (i < n1 && j < n2) {
  77.         if (L[i] <= R[j]) {
  78.             // Азбучен ред
  79.             strArr[k++] = L[i++];
  80.         } else {
  81.             strArr[k++] = R[j++];
  82.         }
  83.     }
  84.     while (i < n1) strArr[k++] = L[i++];
  85.     while (j < n2) strArr[k++] = R[j++];
  86. }
  87.  
  88. void mergeSortString(vector<string> &strArr, int low, int high) {
  89.     if (low >= high) return;
  90.     int mid = low + (high - low) / 2;
  91.     mergeSortString(strArr, low, mid);
  92.     mergeSortString(strArr, mid + 1, high);
  93.     mergeString(strArr, low, mid, high);
  94. }
  95.  
  96.  
  97. int partitionGrades(vector<double> &grades, int low, int high) {
  98.     double pivot = grades[high];
  99.     int i = (low - 1);
  100.     for (int j = low; j < high; j++) {
  101.         if (grades[j] <= pivot) {
  102.             i++;
  103.             swap(grades[i], grades[j]);
  104.         }
  105.     }
  106.     swap(grades[i + 1], grades[high]);
  107.     return (i + 1);
  108. }
  109.  
  110. void quickSortGrades(vector<double> &grades, int low, int high) {
  111.     if (low < high) {
  112.         int pi = partitionGrades(grades, low, high);
  113.         quickSortGrades(grades, low, pi - 1);
  114.         quickSortGrades(grades, pi + 1, high);
  115.     }
  116. }
  117.  
  118. int main() {
  119.     // 1
  120.     cout << "Zad 1 - Broy i chisla: ";
  121.     int n1;
  122.     cin >> n1;
  123.     vector<int> arr1;
  124.     for (int i = 0; i < n1; i++) {
  125.         int a;
  126.         cin >> a;
  127.         arr1.push_back(a);
  128.     }
  129.     mergeSortReverse(arr1, 0, n1 - 1);
  130.     for (int x: arr1) cout << x << " ";
  131.     cout << endl;
  132.     // 2
  133.     cout << "Zad 2 - Broy i chisla: ";
  134.     int n2;
  135.     cin >> n2;
  136.     vector<int> arr2;
  137.     for (int i = 0; i < n2; i++) {
  138.         int a;
  139.         cin >> a;
  140.         arr2.push_back(a);
  141.     }
  142.     quickSortReverse(arr2, 0, n2 - 1);
  143.     for (int x: arr2) cout << x << " ";
  144.     cout << endl;
  145.     // 3
  146.     cout << "Zad 3 - Sravnenia: " << endl;
  147.     cout << "Merge Sort Comparisons: " << mergeSortComparisons << endl;
  148.     cout << "Quick Sort Comparisons: " << quickSortComparisons << endl;
  149.     // 4
  150.     cout << "Zad 4 - Broy i imena: ";
  151.     int n4;
  152.     cin >> n4;
  153.     vector<string> names(n4);
  154.     for (int i = 0; i < n4; i++) cin >> names[i];
  155.     mergeSortString(names, 0, n4 - 1);
  156.     for (string s: names) cout << s << " ";
  157.     cout << endl;
  158.     // 5
  159.     cout << "Zad 5 - Broy i ocenki: ";
  160.     int n5;
  161.     cin >> n5;
  162.     vector<double> grades(n5);
  163.     for (int i = 0; i < n5; i++) cin >> grades[i];
  164.     quickSortGrades(grades, 0, n5 - 1);
  165.     for (double g: grades) cout << g << " ";
  166.     cout << endl;
  167.     //6
  168.     cout << "Zad 6 - Broy i uchenici (ime uspeh): ";
  169.     int n6;
  170.     cin >> n6;
  171.     vector<Student> students(n6);
  172.     for (int i = 0; i < n6; i++) {
  173.         cin >> students[i].name >> students[i].grade;
  174.     }
  175.     for (int i = 0; i < n6 - 1; i++) {
  176.         int maxGrade = i;
  177.         for (int j = i + 1; j < n6; j++) {
  178.             if (students[j].grade > students[maxGrade].grade) {
  179.                 maxGrade = j;
  180.             } else if (students[j].grade == students[maxGrade].grade) {
  181.                 int k = 0;
  182.                 while (students[j].name[k] != '\0' && students[j].name[k] == students[maxGrade].name[k]) k++;
  183.                 if (students[j].name[k] < students[maxGrade].name[k]) maxGrade = j;
  184.             }
  185.         }
  186.         swap(students[i], students[maxGrade]);
  187.     }
  188.     for (int i = 0; i < n6; i++) {
  189.         cout << students[i].name << " " << students[i].grade << endl;
  190.     }
  191.  
  192.     return 0;
  193. }
  194.  
Advertisement
Add Comment
Please, Sign In to add comment