Итак, совсем недавно, просто из любопытства, я купил книгу «Введение в алгоритмы» автора CLRS. Когда я начал читать книгу, я заметил, что некоторые очень типичные алгоритмы в книге реализованы совсем по-другому.
Реализация быстрой сортировки в CLRS сильно отличается от популярного алгоритма Хоара для быстрой сортировки.
Итак, приступая к моему вопросу...
void insertion_sort_by_robertsedgewick(int a[],int n)
{
for(int i=0;i<n;i++)
{
for(int j=i;j>0;j--)
{
if(a[j]<a[j-1])
{
swap(a[j],a[j-1]);
}
}
}
}
это код, используемый Робертом Седжвиком в его курсе Coursera по алгоритмам.
Напротив, реализация сортировки вставками, представленная в CLRS, такова:
void insertion_sort_CLRS(int a[] , int n)
{
int key,j;
for(int i=1; i<n; i++)
{
key = a[i];
j = i - 1;
while(j>=0 && a[j]>key)
{
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
Что довольно странно, так это время работы. Вот мои результаты, когда я запустил две разные реализации:
Количество элементов в массиве: 10 000
Время реализации Роберта Седжвика: 0,235926 с.
Время реализации CLRS: 0,078608 с.
Может ли кто-нибудь объяснить мне эти результаты? Алгоритм примерно тот же. Только реализация разная. Как небольшая разница в реализации могла вызвать такую огромную разницу во времени выполнения?