Скачиваний:
1
Добавлен:
22.09.2026
Размер:
94 Кб
Скачать
☆

Приложение 1. Листинг программных модулей

#include <iostream>

#include <cstdlib>

#include <ctime>

#include <algorithm>

#include <chrono>

#include <iomanip>

using namespace std::chrono;

using namespace std;

const int N = 2000; // Размер массива

const unsigned long NN = 10000; // Количество повторений сортировки

void merge(int list[],int start, int end, int mid);

// Функция генерации случайных чисел

int rrand(int range_min, int range_max) {

    return rand() % (range_max - range_min + 1) + range_min;

}

// Сортировка вставками

void sort_inserts(int x[], int n)

{

    for(int i = 1; i < n; i++)    

        for(int j = i; j > 0 && x[j-1] > x[j]; j--) // пока j>0 и элемент j-1 > j, x-массив int

            swap(x[j-1], x[j]);

}

// Сортировка слиянием

void mergeSort(int list[], int start, int end)

{

    int mid;

    if (start < end){

     

        mid=(start+end)/2;

        mergeSort(list, start, mid);

        mergeSort(list, mid+1, end);

        merge(list,start,end,mid);

    }

}

void merge(int list[], int start, int end, int mid)

{

    int mergedList[N];

    int i, j, k;

    i = start;

    k = start;

    j = mid + 1;

   

    while (i <= mid && j <= end) {

        if (list[i] < list[j]) {

            mergedList[k] = list[i];

            k++;

            i++;

        }

        else {

            mergedList[k] = list[j];

            k++;

            j++;

        }

    }

   

    while (i <= mid) {

        mergedList[k] = list[i];

        k++;

        i++;

    }

   

    while (j <= end) {

        mergedList[k] = list[j];

        k++;

        j++;

    }

   

    for (i = start; i < k; i++) {

        list[i] = mergedList[i];

    }

}

// Вывод массива

void print_array(int arr[], int size) {

    for (int i = 0; i < size; i++) {

        cout << arr[i] << " ";

    }

    cout << endl;

}

int main()

{

    srand(static_cast<unsigned>(time(nullptr)));

    int orig[N]={};

    int work[N]={};

    cout << "Array size: " << N << endl;

   

    for (int i = 0; i < N; i++)

    {

        orig[i] = rrand(-N, N);

    }

    cout << "First 20 elements of array before sorting: ";

    print_array(orig, 20);

    // Измеряем время копирования

    auto start_copy = high_resolution_clock::now();

    for (unsigned long i = 0; i < NN; ++i) {

        copy(orig, orig + N, work);   // копируем original в work

    }

    auto end_copy = high_resolution_clock::now();

    duration<double> copy_time = end_copy - start_copy;

    // Сортировка вставками

    auto start_is = high_resolution_clock::now();

    for (unsigned long i = 0; i < NN; ++i) {

        copy(orig, orig + N, work);

        sort_inserts(work, N);

    }

    auto end_is = high_resolution_clock::now();

    duration<double> insertion_time = (end_is - start_is - copy_time)/NN;

    cout << "\nFirst 20 elements of array after insertion sorting: ";

    print_array(work, 20);

    // Сортировка слиянием

    auto start_ms = high_resolution_clock::now();

    for (unsigned long i = 0; i < NN; ++i) {

        copy(orig, orig + N, work);

        mergeSort(work, 0, N - 1);

    }

    auto end_ms = high_resolution_clock::now();

    duration<double> merge_time = (end_ms - start_ms - copy_time)/NN;

    cout << "\nFirst 20 elements of array after merge sorting: ";

    print_array(work, 20);

    // Выводим результаты

    cout << fixed << setprecision(6);

    cout << "\nInsertion sort time: " << duration<double, milli>(insertion_time).count() << " ms" << endl;

    cout << "Merge sort time: " << duration<double, milli>(merge_time).count() << " ms" << endl;

    return 0;

}

Соседние файлы в папке Отчёты Дагаев