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


vector<int> generateArray(int size, const string& type) { //генерация массива
    vector<int> arr(size);
    if (type == "po_vozrast") {
        for (int i = 0; i < size; i++) arr[i] = i;
    }
    else if (type == "reversed") {
        for (int i = 0; i < size; i++) arr[i] = size - i;
    }
    else {
        for (int i = 0; i < size; i++) arr[i] = i;
        mt19937 rng(42);
        shuffle(arr.begin(), arr.end(), rng);
    }
    return arr;
}

double measureSort(void(*sortFunc)(vector<int>&), vector<int> arr) { // таймер
    comparisons = 0;
    swaps = 0;
    auto start = chrono::high_resolution_clock::now();
    sortFunc(arr);
    auto end = chrono::high_resolution_clock::now();
    return chrono::duration<double, milli>(end - start).count();
}

void runExperiments(const string& sortName, void(*sortFunc)(vector<int>&)) {
    cout << "\n=== " << sortName << " ===\n";
    cout << left << setw(10) << "m"
        << setw(12) << "Параметр"
        << setw(20) << "По возрастанию"
        << setw(20) << "По убыванию"
        << setw(20) << "Случайный"
        << "Среднее\n";
    cout << string(82, '-') << "\n";

    const int RUNS = 10;
    vector<int> sizes = { 1000, 10000, 100000 };
    vector<string> types = { "po_vozrast", "reversed", "random" };

    for (int size : sizes) {
        double cmpAvg[3] = {}, swpAvg[3] = {}, timeAvg[3] = {};

        for (int t = 0; t < 3; t++) {
            double totalCmp = 0, totalSwp = 0, totalTime = 0;
            for (int r = 0; r < RUNS; r++) {
                vector<int> arr = generateArray(size, types[t]);
                double ms = measureSort(sortFunc, arr);
                vector<int> arr2 = arr;
                comparisons = 0; swaps = 0;
                sortFunc(arr2);
                totalCmp += comparisons;
                totalSwp += swaps;
                totalTime += ms;
            }
            cmpAvg[t] = totalCmp / RUNS;
            swpAvg[t] = totalSwp / RUNS;
            timeAvg[t] = totalTime / RUNS;
        }

        auto printRow = [&](const string& param, double v[3]) {
            double avg = (v[0] + v[1] + v[2]) / 3.0;
            cout << left << setw(10) << size
                << setw(12) << param
                << setw(20) << fixed << setprecision(1) << v[0]
                << setw(20) << v[1]
                << setw(20) << v[2]
                << avg << "\n";
            };

        printRow("compare", cmpAvg);
        printRow("swap", swpAvg);
        printRow("time(ms)", timeAvg);
        cout << "\n";
    }
}

int main() {
    setlocale(LC_ALL, "ru");
    runExperiments("1. Сортировка выбором", selectionSort);
    runExperiments("2. Сортировка вставками", insertionSort);
    runExperiments("3. Пузырьковая сортировка", bubbleSort);
    runExperiments("4. Пирамидальная сортировка", Pyramid);
    runExperiments("5. Timsort (вариант)", timSort);
    return 0;
}