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

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

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

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

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

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

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


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


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

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

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

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

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

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


ДЛЯ АВТОРОВ:


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

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

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

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

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


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


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

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

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

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

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


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

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

Сперва подумал, что это - очередная бестолковщина, когда профессор МИТ целый академический час льёт воду в уши первокурам. (А такие лекции на ютубе - в ассортименте!).

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


Всё равно, 50 минут трындежа можно было легко заменить распечаткой субтитров с небольшим количеством слайдов-скриншотов, на чтение и рассматривание которых уйдёт меньше времени.

Формат таких видео-лекций - остаюсь при своём ИМХО - избыточен. Только если кому-то хочется потренироваться в слушании американского английского.


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

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

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

И поэтому заголовок выглядит кликбейтом и обманом, а к кликбейту в интернете сами знаете, какое отношение.

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

"И на практике используют, например, всякие комбинации из квиксорта, слияния и вставок." можно пример? желательно на java:D

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

Я в потроха явовского фреймворка не полезу.

А в реализациях стандартной библиотеки для C++ бывают варианты.


Например, в убунте, реализация библиотеки от Silicon Graphics, сделано так:

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

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

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


Реализацию с промежуточным слиянием я тоже встречал, но давно (кажется, в Dinkumware - которую использовала Visual Studio), подробностей не упомню. Суть такая же: короткие массивы удобно сортировать вставками или слиянием (и даже можно выделить промежуточный буфер под это дело), массивы среднего размера - слиянием, если у нас есть достаточно памяти под промежуточный буфер, всё остальное - квиксорт. Как только доходим в рекурсии до соответствующего размера подмассива, применяем вставки или слияния.


Вообще, сортировке Дональд Кнут чуть не целый том посвятил. Там хватает рокетсаенса и дьяволов в деталях.

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

Премного благодарен за развернутый ответ. У меня есть книженция по алгоритмам и сортировкам java и там не встречалось комбинированных сортировок:) Отсюда и вопрос. Видимо нужно ознакомиться с литературой Дональда Кнута

1
Автор поста оценил этот комментарий
Стандартный сорт c++
сначала qsort, который обрывается на глубине, потом heap sort вроде, плюс сортировка 4х элементов за 5 сравнений явно
раскрыть ветку (4)
Автор поста оценил этот комментарий

Спасибо) Значит такое действительно применяется в практике

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

В стандарте не прописана реализация. Поэтому неплохо бы указать, о каком компиляторе / поставщике библиотеки идёт речь.

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

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

Сперва квиксорт с отсечкой глубины и ширины, а потом вставки по всему массиву.

Хипсорт там нигде не упоминается.


Интросорт - это модификация квиксорта, где короткие подмассивы (у SGI - то есть, у gcc - порог равен 16) сортируются вставками.

Ну и там концевую рекурсию развернули в цикл; если не знать об этом приёме, то код кажется довольно странным.

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