Это медленнее / быстрее, чем другие методы сортировки?
Давайте проанализируем сложность времени этой функции .Как много работы потребуется для увеличения размера несортированного списка?
Важной частью являются циклы.Они скажут нам, сколько раз вам нужно сделать это, и вот что важно.Ваши циклы можно разбить на это:
for(1 to s){
for(1 to s){
do that thing
}
}
Для каждого элемента он должен перепроверить каждый элемент.Если есть 2 предмета, это значит, что вы делаете это 4 раза.3 предмета, 9 раз.4 предмета, 16 раз.Мы говорим, что временная сложность равна n^2
(n
- это условное обозначение размера), потому что при увеличении размера число шагов возводится в квадрат.Это означает, что время, которое требуется, будет расти экспоненциально с увеличением размера.На 10 предметов это занимает 100 раз.На 100 предметов уходит 10000.На 1000 это занимает 1 000 000.Если возможно, следует избегать n^2
.
Большинство алгоритмов сортировки могут выполнять свою работу за n * log(n)
или квазилинейное время.По мере увеличения размера время будет увеличиваться на n * log(n)
.Это быстрее, чем линейный, но медленнее, чем экспоненциальный.log(n)
часто является натуральным логарифмом или ln(n)
.На 10 предметов это займет около 23 раз.100 около 460. При 1000 около 6900. Так что ваш алгоритм медленнее.
Алгоритмы выше n * log(n)
растут настолько быстро, что необходимо искажать вертикальшкала времени, чтобы осмысленно разместить их на одном графике с более эффективными алгоритмами.
Как вы можете догадаться, для большого количества элементов важнее иметь более эффективный алгоритм, чем выполнять его быстрее.Алгоритм n^2
, который делает вещь в 100 раз быстрее, чем n log n
, потеряет около 600 предметов.
n^2 = 100 n * ln(n)
n = 100 ln(n)
n / ln(n) = 100