Один из способов сортировки набора предметов заключается в составлении списков, где зафиксированы все возможные комбинации предметов, и последующей проверке всех этих записей, чтобы убедиться, что порядок правильный. Представьте, что ваша музыкальная коллекция состоит всего из пяти альбомов – по одному от Led Zeppelin, Queen, Coldplay, Oasis и Abba. Но эти пять альбомов можно расставить (сгруппировать) 120 разными способами. Шесть альбомов – 720 способами, десять – более чем тремя миллионами способов. Количество комбинаций растет настолько быстро, что любой уважающий себя фанат пластинок запретит себе даже пытаться перепробовать их все: это просто нереально.
К счастью, как вы, вероятно, знаете из собственного опыта, сортировка коллекции записей, книг или DVD-дисков является проблемой категории Р – одной из тех, для которых есть практическое решение. Самый простой алгоритм такого решения называется пузырьковая сортировка (или сортировка простыми обменами). Работает он следующим образом. Мы сокращаем исполнителей из нашей скудной коллекции записей до первых букв – L, Q, C, O и A с тем, чтобы расставить их в алфавитном порядке. Алгоритм пузырьковой сортировки проверяет весь набор попарно слева направо и меняет соседние альбомы, если они расположены неверно (не в алфавитном порядке). Он продолжает просматривать альбомы, пока не расставит все в правильном порядке, рассортировав всю коллекцию. На первом проходе L остается на том же месте (в алфавите она идет раньше Q), но при сравнении Q и C алгоритм определит, что они расставлены неверно и поменяет их местами. Дальше сортировка продолжается: в процессе первого прохода местами поменяются Q и O, а затем – Q и A; список приобретет вид L, C, O, A, Q. К концу этого прохода Q окажется на своем законном месте в конце списка. На втором проходе С поменяется местами с L, а А – с О, в результате чего О тоже окажется в правильном месте: C, L, A, O, Q. Для того чтобы поставить А на первое место и выстроить весь список в правильном алфавитном порядке, потребуется еще два прохода.
Сортируя пять альбомов, нам пришлось прочесать несортированный список четыре раза, каждый раз делая по четыре сравнения. С десятью альбомами нам потребовалось бы девять проходов с девятью сравнениями в каждом. Это означает, что объем работы, который мы должны выполнить во время сортировки, растет почти в квадрате количества сортируемых объектов. Для сортировки большой коллекции потребуется уйма работы, но все же сотни сравнений, которые нужны, чтобы рассортировать 30 альбомов при пузырьковом алгоритме выглядят привлекательнее триллионов возможных расстановок, которые нам пришлось бы рассмотреть, возьмись мы сортировать коллекцию путем простого (полного) перебора всех возможных комбинаций. Несмотря на все достоинства пузырькового метода, ученые-компьютерщики отзываются о нем пренебрежительно, считая его неэффективным. В реальных интернет-приложениях, таких как лента новостей Facebook или лента фотографий Instagram, где нужно сортировать и отображать в соответствии с последними приоритетами технологических гигантов миллиарды сообщений, от простых пузырьковых алгоритмов приходится отказываться в пользу их более современных и совершенных родичей. Сортировка слиянием, например, сначала разбивает сообщения на небольшие группы, которые затем быстро сортируются и компонуются в правильном порядке.
В 2008 году во время предвыборной кампании в США Джона Маккейна, объявившего о намерении выставить свою кандидатуру, вскоре после этого пригласили выступить в Google, чтобы обсудить его политическую платформу. Эрик Шмидт, в тот момент генеральный директор Google, в шутку сказал тогда Маккейну, что баллотироваться на пост президента – примерно то же самое, что и проходить собеседование при приеме на работу в Google. А затем задал ему один из вопросов, которые задают на таком собеседовании: «Как вы определите хорошие способы сортировки одного миллиона 32-битных целых чисел в двух мегабайтах оперативной памяти?» Маккейн смешался, а Шмидт, повеселившись, быстро перешел к следующему вопросу – уже серьезному. Шесть месяцев спустя, когда в прицеле Google оказался Барак Обама, Шмидт задал ему тот же самый вопрос. Обама посмотрел на публику, потер бровь и начал: «Ну, э-э-э…». Чувствуя растерянность Обамы, Шмидт попытался вмешаться, но как раз в этот момент Обама закончил, глядя Шмидту прямо в глаза: «…нет-нет-нет, я думаю, что делать это через “пузырьки” – не лучшая идея», – под гром аплодисментов и одобрительные крики собравшихся компьютерщиков. Неожиданная эрудиция Обамы – шутка «для посвященных» о неэффективности пузырькового алгоритма сортировки – была одним из ключевых элементов его, казалось бы, естественной харизмы (которую на деле обеспечивала тщательная подготовка), отличавшей всю его кампанию и в конце концов приведшей его в Белый дом.