Я тестировал временную сложность различных алгоритмов сортировки для разных последовательностей чисел, и все было хорошо, пока я не получил быструю сортировку (с центром в центре), для последовательностей, которые на одну половину возрастают, а другая - на нисходящую. График:
(Под "V" я подразумеваю последовательность, в которой первая половина нисходит, а другая - вверх, а под "A" - последовательность, в которой первая половина возрастает, а другая половина убывает.)
Результаты для других видов последовательностей выглядят так, как я ожидал, но, возможно, что-то не так с моим алгоритмом?
void quicksort(int l,int p,int *tab)
{
int i=l,j=p,x=tab[(l+p)/2],w; //x - pivot
do
{
while (tab[i]<x)
{
i++;
}
while (x<tab[j])
{
j--;
}
if (i<=j)
{
w=tab[i];
tab[i]=tab[j];
tab[j]=w;
i++;
j--;
}
}
while (i<=j);
if (l<j)
{
quicksort(l,j,tab);
}
if (i<p)
{
quicksort(i,p,tab);
}
}
Есть ли у кого-нибудь идеи, что вызвало такие странные результаты?