11.10.2009, 03:08
общий
это ответ
Здравствуйте, Dimon4ik.
А у сортировки и не долна быть линейная зависимость. Хороший показатель для сравнивающей сортировки (это почти все использующиеся кроме корзинки) - n*log(n). А вернее - log(n!), что немного меньше. Сложность у хороших методов обычно в границах 1,5*logn - 3*logn. Оба Ваши примера относятся к плохим - их сложность n^2. А разные числа - тут мы сталкиваемся с реальностью, а не с теорией :)
1) Слишком короткие временные рамки - очень велика погрешность измерений. Это можно сгладить.
2) Разное количество операций на итерацию у разных алгоритмов. Благодаря этому, если сравнивать отношение времени у двух алгоритмов - оно тоже будет плавать. "Быстрые" алгоритмы обычно очень плохо дружат с короткими последовательностями.
3) Во время выполнения может проснуться какая-то другая программа (вот тут короткий интервал все портит)
4) Параметры системы: если количество данных уже не помещается в кеш или в оперативную память - производительность очень резко падает.
5) Разные последовательности одинаковой длины все равно требуют разного количества операций. Причем зачастую очень разного. Более-менее стабильные сортировки: Heapsort, Mergesort, Tablesort.
Так что для теста желательно заготовить сортируемый блок и перед вызовом метода копировать этот блок в рабочий массив. А короткую сортировку просто повторять по 100-1000 раз. Но также: копировать данные из заготовки. Еще можно воспользоваться счетчиком: они менее зависимы от внешних условий.
А еще желательно проделать эту процедуру несколько раз с заново сгенерированными блоками, чтобы не впадать в зависимость.