Алгоритмы: сортировка вставками и слиянием

Как быть, если есть массив, и его нужно отсортировать? В программировании это случается почти* каждый день. К счастью, сегодня мы перевели для вас новую часть курса алгоритмов — ту самую, где профессор Девадас рассказывает про эту фундаментальную задачу и способы её решения.

Устраивайтесь поудобнее, будет интересно.

Для вас старались:

Переводчики — Даниил Левицкий, Дерсим Даваод

Редактор и монтажёр — Олег Жданов

Корректор — Дмитрий Мирошниченко


Если ты умеешь в английский, русский или какую-нибудь тему наших переводов — присоединяйся к нам, мы найдём что-нибудь интересное и для тебя.


* по данным программистов, ежедневно пишущих сортировку

Лига образования

4.4K постов21.8K подписчик

Добавить пост

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако мы хотим, чтобы соблюдались следующие условия:


ДЛЯ АВТОРОВ:


Приветствуются:

-уважение к читателю и открытость

-желание учиться

Не рекомендуются:

-публикация недостоверной информации


ДЛЯ ЧИТАТЕЛЕЙ:


Приветствуются:

-конструктивные дискуссии на тему постов

Не рекомендуются:

-личные оскорбления и провокации

-неподкрепленные фактами утверждения


В этом сообществе мы все союзники - мы все хотим учиться! :)

Вы смотрите срез комментариев. Показать все
33
Автор поста оценил этот комментарий

Нормальные программисты сортировку не пишут. Они используют библиотечный вызов sort().

раскрыть ветку (98)
31
Автор поста оценил этот комментарий

ага, а потом к тебе в компанию приходят дауны, которые фреймворки и библиотеки используют как ёбаные книги заклинаний без малейшего понимания, что там вообще внутри происходит

раскрыть ветку (12)
14
Автор поста оценил этот комментарий
а потом к тебе в компанию приходят дауны, которые фреймворки и библиотеки используют как ёбаные книги заклинаний без малейшего понимания, что там вообще внутри происходит

или хуже того, задорные ребята, которые долго пишут свои велосипеды  и страшно обижаются, если их прервать

раскрыть ветку (5)
3
Автор поста оценил этот комментарий

по-вашему, знание того, что происходит под капотом, приводит к желанию писаль велосипеды?

раскрыть ветку (4)
4
DELETED
Автор поста оценил этот комментарий
По моим наблюдениям - да. Последний пример - текущее место работы. Компания потеряла миллионы долларов из-за одного человека, который надобавлял хайпового говна и кучу велосипедов. Всем этим вынуждена была пользоваться вся команда. Человек ушел и мы сейчас переписываем потихоньку.

Существует прямая связь между гипертрофированной любознательностью, хайпожуйством и переизобретением велосипедов.
Автор поста оценил этот комментарий

Только иногда, особенно тяжело с более старшими программистами. Непонимание, конечно, плохо, но идеальный разбор внутренностей всего на свете очень даже мешает проекту

раскрыть ветку (2)
Автор поста оценил этот комментарий

Чем это мешает? Это способствует быстрому решению любых возникающих проблем.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Это способствует быстрому решению любых возникающих проблем.
и порождает новые, когда человек вместо быстрого выполнения задачи вникает во все сразу. Если это место станет узким, можно и исследовать его, углубляться во  все и всегда - бесполезно
16
Автор поста оценил этот комментарий
Ну так работает же, чего трогать.
10
Автор поста оценил этот комментарий

это кем надо быть и что делать, чтобы не понять, что функция sort сортирует массив, скажем. нахуя мне знать, как она там внутри сортирует, если она сортирует. нахуя мне знать, что оно там недайбоже юзает красночерное дерево, вот нахуя? мне надо знать, например, что sort может сортить по ключу скажем, и знать, как это написать. но мне нахер не нужно знать, что там внутри ибо один хер ты лучше напишешь, 2) порой нету времени изобретать свою хуебистику с кучей багов, когда есть оттестированный встроенный sort.

раскрыть ветку (3)
Автор поста оценил этот комментарий
Это нужно тем, кто будет работать с большими данными (где важно знать сложности каждой строки кода), либо тем кто будет писать узкий софт с конкретными ограничениями сверху, либо самым умным, которые потом будут свои языки или интерпретаторы делать. Для классического программиста да, ценность околонулевая.
раскрыть ветку (2)
Автор поста оценил этот комментарий

Классическим программистом теперь называют того, кто сидит и пишет CRUD’ы?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Да. Малая часть программистов пишет что-то выдающееся, большинство копипастит одно да потому, где проищзводительность находится где-то в последних рядах приоритетов. Поэтому глубокое понимание алгоритмов и не нужно. И даже о легаси зачастую думать не нужно, редкий продукт живет и поддерживается дольше года. Такой работы на рынке большинство. Хочешь скучные, но стабильные задания? Ебашь в ширину стека, поверхностно. Хочешь интересностей, вызовов, крупнейшие компании? Ебашь в глубину (матана).

1
DELETED
Автор поста оценил этот комментарий
Бизнесу гораздо выгоднее иметь узких специалистов, чем набирать тех, кто сходил в универ и поковырялся везде понемногу. Человек, пишущий исключительно на React без глубокого понимания алгоритмов, структур данных и прочей академии, в долгосрочной перспективе будет в десятки раз выгоднее (разработка, поддержка, ущерб от багов) при разработке фронтенда, нежели какой-нибудь даун, который «знает Java, Swift, React, Vue, Angular, RoR, Node.js».
4
Автор поста оценил этот комментарий

Это же просто шутка.


Кстати, а библиотечную функцию sort нормальные программисты пишут?

раскрыть ветку (25)
26
Автор поста оценил этот комментарий

Это другая каста программистов

Там такие программисты, что они почти математики

раскрыть ветку (24)
6
Автор поста оценил этот комментарий

Да любой программист может написать sort. Просто для этого ему нужно заебаться с изучением математики и анализом. Ну или хотя бы почитать пару статей. Смысл этого всего только академический, практического смысла нет.

раскрыть ветку (19)
7
Автор поста оценил этот комментарий

Да, и работать этот sort будет на прикладном уровне, в 100 раз медленнее (и в 1000 для всяких скриптовых языков) библиотечного, да ещё и память забьёт на коллекции размером больше объема оперативки и выполняться будет в один поток


Чтобы хорошо написать и все учесть, да ещё и процессорные инструкции заюзать нужны специфические знания и немного матана

раскрыть ветку (17)
5
Автор поста оценил этот комментарий
Да, и работать этот sort будет на прикладном уровне, в 100 раз медленнее (и в 1000 для всяких скриптовых языков) библиотечного, да ещё и память забьёт на коллекции размером больше объема оперативки и выполняться будет в один поток

Алгоритмов сортировки - овердохуя. В 99.99% случаев достаточно стандартного. Но. Бывает, что и недостаточно. Тогда анализируем, сколько элементов массива и насколько они обычно упорядочены. Потом берём 3-й том Кнута и выбираем на основе этих двух значений нужный алгоритм.


Эта... А нахуя нужна сортировка в несколько потоков?

раскрыть ветку (14)
7
Автор поста оценил этот комментарий
Чтобы быстрее отсортировать, не?
ещё комментарии
2
Автор поста оценил этот комментарий

Для этого пишется компаратор и передаётся библиотечной функции вместе с массивом


Многопоточность для повышения производительности конечно

раскрыть ветку (3)
Автор поста оценил этот комментарий

Если ты под компаратором подразумеваешь не лямбду по сравнению двух элементов, а полноценный алгоритм сортировки, на который библиотечный сорт заменит стандартный, то тогда сути это не меняет.


Многопоточность для повышения производительности конечно

Многопоточность проканает только при наличии свободных ядер, доступа к ним, а также большого массива данных. Очень большого.

На одном ядре вся эта многопоточность отсосёт. А какие ресурсы тебе выделит операционка под твою задачу по-умолчанию - большой вопрос.

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Не, я пишу для тех случаев когда это действительно надо, пара сотен объектов и на js в один поток достаточно быстро отсортируются, даже пузырьком


Компаратор - это компаратор, просто функция для сравнения объектов алгоритмов сортировки содержать в принципе не может

раскрыть ветку (1)
Автор поста оценил этот комментарий
Компаратор - это компаратор, просто функция для сравнения объектов алгоритмов сортировки содержать в принципе не может

Теоретически, может и сравнение самих данных. Практически - нахер не нужно.

Но в этом случае ты не управляешь выбором алгоритма от степени упорядоченности твоих данных.

Автор поста оценил этот комментарий

вы меня простите, но вы юзаете какой-то нихуя неправильный сорт. в нормальных фреймворках сорт девелоперы фреймворка оптимизируют

раскрыть ветку (1)
Автор поста оценил этот комментарий

там речь про самописный sort
sort из фреймворка можно считать библиотечным, им не прикладной программист занимается, а платформенный или системный

хотя, программист фреймфорков тоже достаточно высокоуровнево пишет

прикладной должен шалить в бизнесе
системный в платформах, компиляторах, операционках, местами уметь вставить алгоритм на С или Асме

1
Автор поста оценил этот комментарий

любая embedded система для которой нет реализации стандартной библиотеки/стандартная реализация не подходит (из-за рекурсии, стабильности, памяти и т.д.) и системный программист (а не математик) садится и пишет сортировку

3
Автор поста оценил этот комментарий

Математики изобретают новые алгоритмы. А реализовать готовый алгоритм любой дебил может.

раскрыть ветку (3)
Автор поста оценил этот комментарий

Это правда, что придумать новый эффективный алго сложнее, чем его написать, но... либо вы 2200+(в чем я сомневаюсь), либо в глаза не видели "алгоритмы".

раскрыть ветку (2)
Автор поста оценил этот комментарий

Призёр республиканских олимпиад по программированию не видел алгоритмы, ага, куда уж мне.

раскрыть ветку (1)
Автор поста оценил этот комментарий

вот это уже разговор ближе к теме. Но все же... например мне, в свое время, было сложно понять ффт, кто и прочее подобное, не говоря уже том, что бы применить это во время контеста.

И, к сожалению, я не знаю каков уровень "республиканских" по сравнению с тем, с чем знаком я.

7
Автор поста оценил этот комментарий
Нормальные программисты

кодеры


Компетенция разработчика ПО подразумевает знание базовых алгоритмов без всяких отговорок. Как иначе оценивать асимптотическую сложность?

раскрыть ветку (15)
14
Автор поста оценил этот комментарий

Знать и использовать - разные вещи. Нормальный программист должен прочитать всего Кнута. Но для сортировки вызывать библиотечный вызов sort().

раскрыть ветку (12)
7
Автор поста оценил этот комментарий

*вызывать sort() но при этом желательно знать, какой конкретно там sort(), чтобы в случае чего(ну мало ли, вдруг конкретно сортировка окажется самым узким местом в будущем:-D ) заменить на другой алгоритм, более подходящий)

раскрыть ветку (4)
6
Автор поста оценил этот комментарий

Знать надо только одно - для полностью неупорядоченных массивов библиотечный sort() - самый быстрый вариант. Все остальные могут быть быстрее только на частично упорядоченных массивах, но тут уже зависит от массивов.

раскрыть ветку (3)
1
Автор поста оценил этот комментарий
библиотечный sort() - самый быстрый вариант

Если он унутре от количества элементов пляшет, то да, самый быстрый. Возможно. QuickSort поди какой-нить зашит.

2
Автор поста оценил этот комментарий

коллега, не забывайте о памяти и процессоре, не всегда скорость нужна) Но эти случаи все равно только в специфических областях...

1
Автор поста оценил этот комментарий

хотя там вот пишут, что в JS оно медленное, но мы ж про нормальные языки говорим)

ещё комментарии
1
DELETED
Автор поста оценил этот комментарий
Ох уж эти «настоящие программисты», у которых все сводится к экономии миллисекунд.
Автор поста оценил этот комментарий
Работает и ладно
Автор поста оценил этот комментарий

В зависимости от того что сортируешь. Лично писал сортировку (баккет +квик), обходящую стандартную почти в 2 раза (на наших данных)

ещё комментарии
DELETED
Автор поста оценил этот комментарий
Но ты же не настоящий программист, если не умеешь на бумаге написать имплементацию пузырьковой сортировки! А еще, фреймворками пользуются только нубы, тру программеры все пишут с нуля на плюсах!!!
раскрыть ветку (3)
2
Автор поста оценил этот комментарий

Наоборот. Нубы пишут всё сами - так как они ещё не знают фреймворки. Опытные используют возможности фреймворков.

раскрыть ветку (2)
1
DELETED
Автор поста оценил этот комментарий
Видимо на пикабу нужно обязательно писать «сарказм» даже под явно саркастическими постами.
раскрыть ветку (1)
Автор поста оценил этот комментарий

Иногда надо. Так как опять же нубы тут пишут подобную чушь без всякого сарказма.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку