Рассматривая приведенный ниже график для случайных чисел разного размера, которые сортируются с использованием следующего алгоритма: 1) сортировка вставками, 2) сортировка слиянием, 3) быстрая сортировка. Мы видим, что быстрая сортировка является наиболее эффективным алгоритмом для сортировки данных любого размера по сравнению с другими, но если мы используем медиану в качестве опорного значения в быстрой сортировке, это займет слишком много времени. При использовании среднего элемента в качестве опорного он обеспечивает наиболее эффективно отсортированные данные за очень короткое время.

На приведенном ниже графике горизонтальная ось показывает алгоритмы сортировки, а вертикальная ось показывает время в секундах, затрачиваемое алгоритмами на сортировку данных разного диапазона, т.е. (50 100 200 300 400 500 1000)

Код:

#include ‹iostream›
#include‹bits/stdc++.h›
#include‹fstream›
#include ‹time.h›
using namespace std;

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

недействительная вставка (int arr [], int size)
{

ifstream f1("seven.txt");
int i,j,temp;
for (i = 1; i ‹ size; i++)
{
temp=arr[ i];
j = i — 1;

while (j ›= 0 && arr[j] › temp)
{
arr[j+1] = arr[j];
j = j-1;
}
arr[j+1]=temp;
}

}
void merge(int arr[],int first,int mid,int last,int n)
{
int i=first,j=mid+1,k=first;< br /> int arr2[n];
while(i‹=mid && j‹=last)
{
if(arr[i]‹=arr[j])
> {
arr2[k]=arr[i];
i++;
k++;
}
else
{
arr2[k ]=arr[j];
j++;
k++;
}
}
while(i‹= mid)
{
arr2 [k]=arr[i];
i++;
k++;
}
while(j‹= last)
{
arr2[k] =arr[j];
j++;
k++;
}
for(int k=first;k‹=last;k++)
{
arr[k]=arr2[k];
}
}
void mergesort(int arr[],int first,int last,int n)
{
if(first‹last)
{
int mid=(first+last)/2;
mergesort(arr,first,mid,n);
mergesort(arr,mid +1,последний,n);
объединить(прибытие,первый,середина,последний,n);
}
}

void swap(int arr[],int a,int b)
{
int temp=arr[a];
arr[a]=arr[b];
arr [b]=temp;
}
int partition(int arr[],int first,int last)
{
int pivot=arr[first];
while(first‹last)
{
while (arr[first]‹pivot)
{
first++;
}
while(arr[last] ›pivot)
{
последний — ;
}
swap(arr,first,last);
}

}
//быстрая сортировка посередине как сводная
void quicksort(int arr[], int first, int last)
{
int pivot_index ;
if (first ‹ last)
{
pivot_index = partition(arr, first, last);
quicksort(arr, first, pivot_index);
quicksort(arr, pivot_index+1, last);
}


}
//Быстрая сортировка Использовать случайное число в качестве опорной точки
int random_partition(int arr[],int first,int last)
{
int index=first+rand()%(last-first);
swap(arr[index],arr[last]);
return partition(arr,first,last) ;
}
void quicksortrandom(int arr[],int first,int last)
{
int pivot;

if (first ‹ last)
{
pivot=random_partition(arr,first,last);
quicksortrandom(arr, first, pivot-1);
quicksortrandom(arr, pivot +1, last);
}
}
//Быстрая сортировка с использованием медианы в качестве опорной точки
void quick_median(int arr[],int first,int last)
{

int a,b,c;
int temp;
bool flag=true;
if(first‹last)
{
a=first;
b=last+1;
c=arr[first];
while(flag)
{
a++;
while(arr[a]‹c && a‹last)
{
a++;
}
b — ;
while(arr[b]›c && b ›first)
{
b — ;
}
if(a‹b)
{
temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
else
{
flag=false;
}< br /> temp=arr[first];
arr[first]=arr[b];
arr[b]=temp;
quick_median(arr,first,b-1);
quick_median(arr,b+1,last);


}

}
}
void print(int arr[],int size)
{
cout‹‹”\narray после сортировки:\n”;
for (int i = 0; я ‹ размер; i++)
{
cout ‹‹ arr[i] ‹‹ “ “;
}
}

int main()
{
int size=1000,n;
int arr[size];
ofstream m1(“seven.txt”);
for ( int i = 0; i ‹ size; i++)
{
arr[i]=rand();
m1‹‹arr[i]‹‹” “;
}
m1.close();

cout‹‹»Какой алгоритм сортировки вы хотите применить\n1-Сортировка вставками\n2-Сортировка слиянием\n3-Быстрая сортировка (используйте середину в качестве опорной точки) \n4 – Быстрая сортировка (использовать случайное значение в качестве опорного значения)\n5 – Быстрая сортировка (медианное значение в качестве опорного значения)\n”;
cin››n;
struct timespec start, end;
double time_taken;
clock_gettime(CLOCK_MONOTONIC, &start);
switch(n)
{
case 1:
вставка (arr, size);
break;

случай 2:
сортировка слиянием (обр, 0, размер-1, размер);
разрыв;
случай 3:
быстрая сортировка (обр, 0 ,size-1);
перерыв;
случай 4:
quicksortrandom(arr,0,size-1);

перерыв;
случай 5 :
quick_median(arr,0,size-1);
break;

по умолчанию:
cout‹‹"Неправильный выбор";

}
clock_gettime(CLOCK_MONOTONIC, &end);
time_taken = (end.tv_sec — start.tv_sec) * 1e9;
time_taken = (time_taken + (end.tv_nsec — start.tv_nsec) ) *1е-9;
cout ‹‹ "Затраченное время:" ‹‹ фиксированное‹‹ time_taken‹‹"сек" ;
print(arr,size);

}