#include <iostream>
#include <vector>
#include <random>
#include <algorithm>
#include <chrono>
using namespace std;
// Генерация случайного массива
void generateRandomArray(vector<double>& arr, int N)
{
random_device rd;
mt19937 gen(rd());
uniform_real_distribution<> dis(-1000.0, 1000.0);
arr.resize(N);
for (int i = 0; i < N; i++)
arr[i] = dis(gen);
}
// Генерация массива, отсортированного на 95%
void generateAlmostSortedArray(vector<double>& arr, int N)
{
generateRandomArray(arr, N);
sort(arr.begin(), arr.end());
int swaps = N * 0.05;
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dis(0, N - 1);
for (int i = 0; i < swaps; i++)
{
int a = dis(gen);
int b = dis(gen);
swap(arr[a], arr[b]);
}
}
// Сортировка вставками
void insertionSort(vector<double>& arr)
{
int n = arr.size();
for (int i = 1; i < n; i++)
{
double key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
// Слияние для MergeSort
void merge(vector<double>& arr, int left, int mid, int right)
{
int n1 = mid - left + 1;
int n2 = right - mid;
vector<double> L(n1), R(n2);
for (int i = 0; i < n1; i++)
L[i] = arr[left + i];
for (int j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2)
{
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 mergeSort(vector<double>& arr, int left, int right)
{
if (left >= right)
return;
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
// Измерение времени сортировки вставками
double measureInsertion(vector<double> arr)
{
auto start = chrono::high_resolution_clock::now();
insertionSort(arr);
auto end = chrono::high_resolution_clock::now();
chrono::duration<double> diff = end - start;
return diff.count();
}
// Измерение времени сортировки слиянием
double measureMerge(vector<double> arr)
{
auto start = chrono::high_resolution_clock::now();
mergeSort(arr, 0, arr.size() - 1);
auto end = chrono::high_resolution_clock::now();
chrono::duration<double> diff = end - start;
return diff.count();
}
int main()
{
vector<int> sizes = {
1,2,4,8,16,32,64,128,256,512,
1024,2048,4096,8192,16384,32768,65536
};
cout << "N\tInsertion Random\tInsertion 95%\tMerge Random\tMerge 95%\n";
for (int N : sizes)
{
vector<double> arr1, arr2;
// случайные массивы
generateRandomArray(arr1, N);
generateAlmostSortedArray(arr2, N);
double t1 = measureInsertion(arr1);
double t2 = measureInsertion(arr2);
generateRandomArray(arr1, N);
generateAlmostSortedArray(arr2, N);
double t3 = measureMerge(arr1);
double t4 = measureMerge(arr2);
cout << N << "\t"
<< t1 << "\t"
<< t2 << "\t"
<< t3 << "\t"
<< t4 << endl;
}
return 0;}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y2hyb25vPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vINCT0LXQvdC10YDQsNGG0LjRjyDRgdC70YPRh9Cw0LnQvdC+0LPQviDQvNCw0YHRgdC40LLQsAp2b2lkIGdlbmVyYXRlUmFuZG9tQXJyYXkodmVjdG9yPGRvdWJsZT4mIGFyciwgaW50IE4pCnsKICAgIHJhbmRvbV9kZXZpY2UgcmQ7CiAgICBtdDE5OTM3IGdlbihyZCgpKTsKICAgIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEwMDAuMCwgMTAwMC4wKTsKCiAgICBhcnIucmVzaXplKE4pOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQogICAgICAgIGFycltpXSA9IGRpcyhnZW4pOwp9CgovLyDQk9C10L3QtdGA0LDRhtC40Y8g0LzQsNGB0YHQuNCy0LAsINC+0YLRgdC+0YDRgtC40YDQvtCy0LDQvdC90L7Qs9C+INC90LAgOTUlCnZvaWQgZ2VuZXJhdGVBbG1vc3RTb3J0ZWRBcnJheSh2ZWN0b3I8ZG91YmxlPiYgYXJyLCBpbnQgTikKewogICAgZ2VuZXJhdGVSYW5kb21BcnJheShhcnIsIE4pOwoKICAgIHNvcnQoYXJyLmJlZ2luKCksIGFyci5lbmQoKSk7CgogICAgaW50IHN3YXBzID0gTiAqIDAuMDU7CgogICAgcmFuZG9tX2RldmljZSByZDsKICAgIG10MTk5MzcgZ2VuKHJkKCkpOwogICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4gZGlzKDAsIE4gLSAxKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN3YXBzOyBpKyspCiAgICB7CiAgICAgICAgaW50IGEgPSBkaXMoZ2VuKTsKICAgICAgICBpbnQgYiA9IGRpcyhnZW4pOwogICAgICAgIHN3YXAoYXJyW2FdLCBhcnJbYl0pOwogICAgfQp9CgovLyDQodC+0YDRgtC40YDQvtCy0LrQsCDQstGB0YLQsNCy0LrQsNC80LgKdm9pZCBpbnNlcnRpb25Tb3J0KHZlY3Rvcjxkb3VibGU+JiBhcnIpCnsKICAgIGludCBuID0gYXJyLnNpemUoKTsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBkb3VibGUga2V5ID0gYXJyW2ldOwogICAgICAgIGludCBqID0gaSAtIDE7CgogICAgICAgIHdoaWxlIChqID49IDAgJiYgYXJyW2pdID4ga2V5KQogICAgICAgIHsKICAgICAgICAgICAgYXJyW2ogKyAxXSA9IGFycltqXTsKICAgICAgICAgICAgai0tOwogICAgICAgIH0KCiAgICAgICAgYXJyW2ogKyAxXSA9IGtleTsKICAgIH0KfQoKLy8g0KHQu9C40Y/QvdC40LUg0LTQu9GPIE1lcmdlU29ydAp2b2lkIG1lcmdlKHZlY3Rvcjxkb3VibGU+JiBhcnIsIGludCBsZWZ0LCBpbnQgbWlkLCBpbnQgcmlnaHQpCnsKICAgIGludCBuMSA9IG1pZCAtIGxlZnQgKyAxOwogICAgaW50IG4yID0gcmlnaHQgLSBtaWQ7CgogICAgdmVjdG9yPGRvdWJsZT4gTChuMSksIFIobjIpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjE7IGkrKykKICAgICAgICBMW2ldID0gYXJyW2xlZnQgKyBpXTsKCiAgICBmb3IgKGludCBqID0gMDsgaiA8IG4yOyBqKyspCiAgICAgICAgUltqXSA9IGFyclttaWQgKyAxICsgal07CgogICAgaW50IGkgPSAwLCBqID0gMCwgayA9IGxlZnQ7CgogICAgd2hpbGUgKGkgPCBuMSAmJiBqIDwgbjIpCiAgICB7CiAgICAgICAgaWYgKExbaV0gPD0gUltqXSkKICAgICAgICAgICAgYXJyW2srK10gPSBMW2krK107CiAgICAgICAgZWxzZQogICAgICAgICAgICBhcnJbaysrXSA9IFJbaisrXTsKICAgIH0KCiAgICB3aGlsZSAoaSA8IG4xKQogICAgICAgIGFycltrKytdID0gTFtpKytdOwoKICAgIHdoaWxlIChqIDwgbjIpCiAgICAgICAgYXJyW2srK10gPSBSW2orK107Cn0KCi8vINCh0L7RgNGC0LjRgNC+0LLQutCwINGB0LvQuNGP0L3QuNC10LwKdm9pZCBtZXJnZVNvcnQodmVjdG9yPGRvdWJsZT4mIGFyciwgaW50IGxlZnQsIGludCByaWdodCkKewogICAgaWYgKGxlZnQgPj0gcmlnaHQpCiAgICAgICAgcmV0dXJuOwoKICAgIGludCBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7CgogICAgbWVyZ2VTb3J0KGFyciwgbGVmdCwgbWlkKTsKICAgIG1lcmdlU29ydChhcnIsIG1pZCArIDEsIHJpZ2h0KTsKCiAgICBtZXJnZShhcnIsIGxlZnQsIG1pZCwgcmlnaHQpOwp9CgovLyDQmNC30LzQtdGA0LXQvdC40LUg0LLRgNC10LzQtdC90Lgg0YHQvtGA0YLQuNGA0L7QstC60Lgg0LLRgdGC0LDQstC60LDQvNC4CmRvdWJsZSBtZWFzdXJlSW5zZXJ0aW9uKHZlY3Rvcjxkb3VibGU+IGFycikKewogICAgYXV0byBzdGFydCA9IGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKCiAgICBpbnNlcnRpb25Tb3J0KGFycik7CgogICAgYXV0byBlbmQgPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CgogICAgY2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IGRpZmYgPSBlbmQgLSBzdGFydDsKCiAgICByZXR1cm4gZGlmZi5jb3VudCgpOwp9CgovLyDQmNC30LzQtdGA0LXQvdC40LUg0LLRgNC10LzQtdC90Lgg0YHQvtGA0YLQuNGA0L7QstC60Lgg0YHQu9C40Y/QvdC40LXQvApkb3VibGUgbWVhc3VyZU1lcmdlKHZlY3Rvcjxkb3VibGU+IGFycikKewogICAgYXV0byBzdGFydCA9IGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKCiAgICBtZXJnZVNvcnQoYXJyLCAwLCBhcnIuc2l6ZSgpIC0gMSk7CgogICAgYXV0byBlbmQgPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CgogICAgY2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IGRpZmYgPSBlbmQgLSBzdGFydDsKCiAgICByZXR1cm4gZGlmZi5jb3VudCgpOwp9CgppbnQgbWFpbigpCnsKICAgIHZlY3RvcjxpbnQ+IHNpemVzID0gewogICAgICAgIDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI1Niw1MTIsCiAgICAgICAgMTAyNCwyMDQ4LDQwOTYsODE5MiwxNjM4NCwzMjc2OCw2NTUzNgogICAgfTsKCiAgICBjb3V0IDw8ICJOXHRJbnNlcnRpb24gUmFuZG9tXHRJbnNlcnRpb24gOTUlXHRNZXJnZSBSYW5kb21cdE1lcmdlIDk1JVxuIjsKCiAgICBmb3IgKGludCBOIDogc2l6ZXMpCiAgICB7CiAgICAgICAgdmVjdG9yPGRvdWJsZT4gYXJyMSwgYXJyMjsKCiAgICAgICAgLy8g0YHQu9GD0YfQsNC50L3Ri9C1INC80LDRgdGB0LjQstGLCiAgICAgICAgZ2VuZXJhdGVSYW5kb21BcnJheShhcnIxLCBOKTsKICAgICAgICBnZW5lcmF0ZUFsbW9zdFNvcnRlZEFycmF5KGFycjIsIE4pOwoKICAgICAgICBkb3VibGUgdDEgPSBtZWFzdXJlSW5zZXJ0aW9uKGFycjEpOwogICAgICAgIGRvdWJsZSB0MiA9IG1lYXN1cmVJbnNlcnRpb24oYXJyMik7CgogICAgICAgIGdlbmVyYXRlUmFuZG9tQXJyYXkoYXJyMSwgTik7CiAgICAgICAgZ2VuZXJhdGVBbG1vc3RTb3J0ZWRBcnJheShhcnIyLCBOKTsKCiAgICAgICAgZG91YmxlIHQzID0gbWVhc3VyZU1lcmdlKGFycjEpOwogICAgICAgIGRvdWJsZSB0NCA9IG1lYXN1cmVNZXJnZShhcnIyKTsKCiAgICAgICAgY291dCA8PCBOIDw8ICJcdCIKICAgICAgICAgICAgIDw8IHQxIDw8ICJcdCIKICAgICAgICAgICAgIDw8IHQyIDw8ICJcdCIKICAgICAgICAgICAgIDw8IHQzIDw8ICJcdCIKICAgICAgICAgICAgIDw8IHQ0IDw8IGVuZGw7CiAgICB9CgogICAgcmV0dXJuIDA7fQ==