Приложение 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;
}
