Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- using namespace std;
- int quickSortComparisons = 0;
- int mergeSortComparisons = 0;
- struct Student {
- char name[50];
- double grade;
- };
- // --- MERGE SORT (REVERSE) ---
- void mergeReverse(vector<int> &arr, int low, int mid, int high) {
- int n1 = mid - low + 1;
- int n2 = high - mid;
- vector<int> L(n1), R(n2);
- for (int i = 0; i < n1; i++) L[i] = arr[low + i];
- for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j];
- int i = 0, j = 0, k = low;
- while (i < n1 && j < n2) {
- mergeSortComparisons++;
- if (L[i] >= R[j]) {
- arr[k++] = L[i++];
- } else {
- arr[k++] = R[j++];
- }
- }
- while (i < n1) arr[k++] = L[i++];
- while (j < n2) arr[k++] = R[j++];
- }
- void mergeSortReverse(vector<int> &arr, int low, int high) {
- if (low >= high) return;
- int mid = low + (high - low) / 2;
- mergeSortReverse(arr, low, mid);
- mergeSortReverse(arr, mid + 1, high);
- mergeReverse(arr, low, mid, high);
- }
- // --- QUICK SORT (REVERSE) ---
- int partitionReverse(vector<int> &arr, int low, int high) {
- int pivot = arr[high];
- int i = low - 1;
- for (int j = low; j < high; j++) {
- quickSortComparisons++;
- if (arr[j] >= pivot) {
- i++;
- swap(arr[i], arr[j]);
- }
- }
- swap(arr[i + 1], arr[high]);
- return i + 1;
- }
- void quickSortReverse(vector<int> &arr, int low, int high) {
- if (low < high) {
- int partitionIndex = partitionReverse(arr, low, high);
- quickSortReverse(arr, low, partitionIndex - 1);
- quickSortReverse(arr, partitionIndex + 1, high);
- }
- }
- // --- MERGE SORT (STRINGS) ---
- void mergeString(vector<string> &strArr, int low, int mid, int high) {
- int n1 = mid - low + 1;
- int n2 = high - mid;
- vector<string> L(n1), R(n2);
- for (int i = 0; i < n1; i++) L[i] = strArr[low + i];
- for (int j = 0; j < n2; j++) R[j] = strArr[mid + 1 + j];
- int i = 0, j = 0, k = low;
- while (i < n1 && j < n2) {
- if (L[i] <= R[j]) {
- // Азбучен ред
- strArr[k++] = L[i++];
- } else {
- strArr[k++] = R[j++];
- }
- }
- while (i < n1) strArr[k++] = L[i++];
- while (j < n2) strArr[k++] = R[j++];
- }
- void mergeSortString(vector<string> &strArr, int low, int high) {
- if (low >= high) return;
- int mid = low + (high - low) / 2;
- mergeSortString(strArr, low, mid);
- mergeSortString(strArr, mid + 1, high);
- mergeString(strArr, low, mid, high);
- }
- int partitionGrades(vector<double> &grades, int low, int high) {
- double pivot = grades[high];
- int i = (low - 1);
- for (int j = low; j < high; j++) {
- if (grades[j] <= pivot) {
- i++;
- swap(grades[i], grades[j]);
- }
- }
- swap(grades[i + 1], grades[high]);
- return (i + 1);
- }
- void quickSortGrades(vector<double> &grades, int low, int high) {
- if (low < high) {
- int pi = partitionGrades(grades, low, high);
- quickSortGrades(grades, low, pi - 1);
- quickSortGrades(grades, pi + 1, high);
- }
- }
- int main() {
- // 1
- cout << "Zad 1 - Broy i chisla: ";
- int n1;
- cin >> n1;
- vector<int> arr1;
- for (int i = 0; i < n1; i++) {
- int a;
- cin >> a;
- arr1.push_back(a);
- }
- mergeSortReverse(arr1, 0, n1 - 1);
- for (int x: arr1) cout << x << " ";
- cout << endl;
- // 2
- cout << "Zad 2 - Broy i chisla: ";
- int n2;
- cin >> n2;
- vector<int> arr2;
- for (int i = 0; i < n2; i++) {
- int a;
- cin >> a;
- arr2.push_back(a);
- }
- quickSortReverse(arr2, 0, n2 - 1);
- for (int x: arr2) cout << x << " ";
- cout << endl;
- // 3
- cout << "Zad 3 - Sravnenia: " << endl;
- cout << "Merge Sort Comparisons: " << mergeSortComparisons << endl;
- cout << "Quick Sort Comparisons: " << quickSortComparisons << endl;
- // 4
- cout << "Zad 4 - Broy i imena: ";
- int n4;
- cin >> n4;
- vector<string> names(n4);
- for (int i = 0; i < n4; i++) cin >> names[i];
- mergeSortString(names, 0, n4 - 1);
- for (string s: names) cout << s << " ";
- cout << endl;
- // 5
- cout << "Zad 5 - Broy i ocenki: ";
- int n5;
- cin >> n5;
- vector<double> grades(n5);
- for (int i = 0; i < n5; i++) cin >> grades[i];
- quickSortGrades(grades, 0, n5 - 1);
- for (double g: grades) cout << g << " ";
- cout << endl;
- //6
- cout << "Zad 6 - Broy i uchenici (ime uspeh): ";
- int n6;
- cin >> n6;
- vector<Student> students(n6);
- for (int i = 0; i < n6; i++) {
- cin >> students[i].name >> students[i].grade;
- }
- for (int i = 0; i < n6 - 1; i++) {
- int maxGrade = i;
- for (int j = i + 1; j < n6; j++) {
- if (students[j].grade > students[maxGrade].grade) {
- maxGrade = j;
- } else if (students[j].grade == students[maxGrade].grade) {
- int k = 0;
- while (students[j].name[k] != '\0' && students[j].name[k] == students[maxGrade].name[k]) k++;
- if (students[j].name[k] < students[maxGrade].name[k]) maxGrade = j;
- }
- }
- swap(students[i], students[maxGrade]);
- }
- for (int i = 0; i < n6; i++) {
- cout << students[i].name << " " << students[i].grade << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment