Нотация Big-O - это просто отношение между входным значением (количество элементов в вашем случае) и сложностью (сложность времени в вашем случае, также может быть сложность пространства).
Вы правы насчет пузырьковой сортировки. Поскольку он повторяется n
раза внутри другого цикла n
раз, временная сложность составляет O (n 2 ).
Быстрая сортировка немного отличается. Он делает количество проходов, которое зависит от n
, но в каждом случае ему удается поместить все значения ниже средней точки «слева», а все значения выше средней точки - «справа» - обе половины еще не отсортирован, но вы знаете, что все левые элементы меньше, чем любой правых элементов (назовем это правилом поворота).
Это в основном делит рабочую нагрузку пополам для каждого подцикла, что приводит к усредненному случаю O (log n). Подобно двоичному поиску или сбалансированным деревьям, любой алгоритм, который делит рабочую нагрузку на коэффициент для каждой итерации, равен O (log n).
Сочетание двух дает O (n log n).
Эта страница википедии на самом деле показывает симпатичный маленький рисунок в правом верхнем углу, который показывает быструю сортировку в действии. Так как картинка стоит тысячи слов (а анимация стоит тысячи картинок), вам нужно немного подумать, чтобы понять.
Вы увидите, что сначала она делит рабочее пространство на две части, а затем переставляет элементы между двумя половинами до тех пор, пока не будет выполнено правило сводки.
Поскольку рабочая нагрузка разделена на две совершенно отдельные независимые области, быстрая сортировка готова для параллельной обработки без конфликта ресурсов. Если у вас достаточно процессоров, как только вы разделите данные на две области, вы можете передать каждую область отдельному процессору для дальнейшего разделения. С пузырьковой сортировкой это невозможно, поскольку такая сортировка не дает вам двух независимых областей.