LINUX.ORG.RU

Сложность алгоритма сортировки

 ,


1

1

«Как горная птица в горах высоко,

Стою я на тумбе в войсках ВКО»

© ефр. А. Гавриков.

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

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

Таким образом получаем на выходе отсортированный список.

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

Не имеет смысла. Предположим это будет иметь в среднем профит над тупым find_max(). Ну давай по какнонам - взять и вставить это типа n, потом каждый раз тебе надо пройтись 1 ... n раз по твоему списку, чтобы найти место. В худжем такое же днище, как и find_max(). Но т.к. он у тебя уже отсортирован, то тебе надо в среднем пройти половину в «лучшем среднем случаее» - т.е. каждый раз проходить 1 ... n/2. С таким же успехом можно пологать, что максимальный елемент будет в первой половине списка и будет тоже самое.

Реально же твоя поделка имеет мистический(возможно реальный) профит над find_max(), но профит над днищем ~= днище.

anonymous
()

Понятно, что в лучшем (когда можна сразу либо в голову, либо в хвост) - O(n), в худшем - O(n^2). А в среднем щас подумаю.

Причем, правильно я понял, что худший случай у тебя такой список: 0 5 1 2 3 4. Too bad

shamaz
()
Ответ на: комментарий от shamaz

А в среднем щас подумаю.

Не, не буду думать. С наскоку не скажешь, но не удивительно, если рост тоже как у квадрата

shamaz
()

Если не считать того, что элемент может вставляться в хвост, то это обычная сортировка вставками.

Средняя сложность такая же (n²), однако отсортированный в обратном порядке список сортируется за n, а не n².

NeXTSTEP ★★
()
Ответ на: комментарий от NeXTSTEP

И для списков inplace merge sort как раз очень хорошо подходит. Тут вот маленький пример имплементации.

beastie ★★★★★
()

сложность получится O(N^2). Так как каждый раз будешь искать заново куда вставить. А если искать место вставки бисекцией, то будет O(NlogN)

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Бисекция на связном списке... Вроде тот же O(n^2) получается, не? За счет последовательного перебора всех элементов. Не прав?

TheKnight ★★★
() автор топика
Ответ на: комментарий от shamaz

да, все верно. Квадрат в худшем случае.

anonymous
()
Ответ на: комментарий от TheKnight

Бисекция на связном списке... Вроде тот же O(n^2) получается, не? За счет последовательного перебора всех элементов. Не прав?

Не прав. чтобы вставить элемент на нужное место надо будет сделать log2(N) сравнений.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

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

anonymous
()
Ответ на: комментарий от anonymous

брр...тогда это уже массив, не? И доступ по индексу в связном списке - это

ну массив, да.

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

ну никто ж не заставляет чистый связанный список использовать.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Если у нас список на массивах - то каждая вставка в элементов в середину или голову вызывает копирование всех элементов вызывает копирование всех элементов от места вставки и до конца. Это еще веселее.

TheKnight ★★★
() автор топика
Ответ на: комментарий от TheKnight

Если у нас список на массивах - то каждая вставка в элементов в середину или голову вызывает копирование всех элементов вызывает копирование всех элементов от места вставки и до конца. Это еще веселее.

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

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

дикли, ты сейчас дерево сбалансированное изобретешь :-P

anonymous
()
Ответ на: комментарий от dikiy

кроме этого - можно держать таблицу ссылок

На ЛОРе можно держать таблицу facepalm'ов

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.