Загрузка данных


8h, [18 мая 2026 в 00:12]
#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>
#include <random>
#include <iomanip>
#include <string>

using namespace std;

long long comparisons = 0; //счетчик для сравнения количесвта сравнений двух элементов в алгоритме
long long swaps = 0; // сколько раз алгоритм свапнул местами элементы

void selectionSort(vector<int>& arr) { // сорт выбором
    int n = arr.size();
    for (int i = 0; i < n - 1; i++) {
        int minIdx = i;
        for (int j = i + 1; j < n; j++) {
            comparisons++;
            if (arr[j] < arr[minIdx])
                minIdx = j;
        }
        if (minIdx != i) {
            swap(arr[i], arr[minIdx]);
            swaps++;
        }
    }
}

void insertionSort(vector<int>& arr) { // сорт вставками
    int n = arr.size();
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            comparisons++;
            arr[j + 1] = arr[j];
            swaps++;
            j--;
        }
        if (j >= 0) comparisons++;
        arr[j + 1] = key;
    }
}

void bubbleSort(vector<int>& arr) { // сортировка пузырьком
    int n = arr.size();
    for (int i = 0; i < n - 1; i++) {
        bool swapped = false;
        for (int j = 0; j < n - i - 1; j++) {
            comparisons++;
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
                swaps++;
                swapped = true;
            }
        }
        if (!swapped) break;
    }
}

void Pyramid_supp(vector<int>& arr, int n, int i) { // вспомогат для пирамидальной
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;

    if (left < n) {
        comparisons++;
        if (arr[left] > arr[largest]) largest = left;
    }
    if (right < n) {
        comparisons++;
        if (arr[right] > arr[largest]) largest = right;
    }

    if (largest != i) {
        swap(arr[i], arr[largest]);
        swaps++;
        Pyramid_supp(arr, n, largest);
    }
}

void Pyramid(vector<int>& arr) { //пирамидальная сорт
    int n = arr.size();
    for (int i = n / 2 - 1; i >= 0; i--)
        Pyramid_supp(arr, n, i);
    for (int i = n - 1; i > 0; i--) {
        swap(arr[0], arr[i]);
        swaps++;
        Pyramid_supp(arr, i, 0);
    }
}

const int RUN = 32; //делим массив на кускочки по 32 элемента

void insertionSortRange(vector<int>& arr, int left, int right) { //вставками для timsort для left and right
    for (int i = left + 1; i <= right; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= left && arr[j] > key) {
            comparisons++;
            arr[j + 1] = arr[j];
            swaps++;
            j--;
        }
        if (j >= left) comparisons++;
        arr[j + 1] = key;
    }
}

void merge(vector<int>& arr, int left, int mid, int right) { //слияние
    vector<int> leftArr(arr.begin() + left, arr.begin() + mid + 1);
    vector<int> rightArr(arr.begin() + mid + 1, arr.begin() + right + 1);

    int i = 0, j = 0, k = left;
    while (i < (int)leftArr.size() && j < (int)rightArr.size()) {
        comparisons++;
        if (leftArr[i] <= rightArr[j]) {
            arr[k++] = leftArr[i++];
        }
        else {
            arr[k++] = rightArr[j++];
            swaps++;
        }
    }
    while (i < (int)leftArr.size()) arr[k++] = leftArr[i++];
    while (j < (int)rightArr.size()) arr[k++] = rightArr[j++];
}

void timSort(vector<int>& arr) { //timsort сорт
    int n = arr.size();
    for (int i = 0; i < n; i += RUN)
        insertionSortRange(arr, i, min(i + RUN - 1, n - 1));
    for (int size = RUN; size < n; size *= 2) {
        for (int left = 0; left < n; left += 2 * size) {
            int mid = min(left + size - 1, n - 1);
            int right = min(left + 2 * size - 1, n - 1);
            if (mid < right)
                merge(arr, left, mid, right);
        }
    }
}