2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Merge Sort без рекурсии
Сообщение24.07.2018, 17:17 


07/10/15

2400
Здравствуйте уважаемые участники форума.
Разбираюсь с алгоритмами сортировки, пытаюсь найти для себя оптимальный вариант.
Алгоритм Merge Sort в этом плане выгодно отличается от других, имея гарантированную сложность $O(n\cdot log(n)$. Но он реализуется рекурсивно. Это мне не очень нравится. Могут возникнуть проблемы с устойчивостью, да и рекурсия плохо укладывается у меня в голове.

Собственно вопрос - можно ли в принципе реализовать Merge Sort, без рекурсии? Известны ли такие реализации?

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 17:19 
Заслуженный участник
Аватара пользователя


16/07/14
8465
Цюрих
Andrey_Kireew в сообщении #1328534 писал(а):
Могут возникнуть проблемы с устойчивостью
Что вы здесь понимаете под устойчивостью?

Вообще, никто не мешает завести стек руками и реализовать рекурсивные вызовы через цикл. Смысл этого, правда, не очень понятен.

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 17:25 
Заслуженный участник
Аватара пользователя


01/09/13
4319
Andrey_Kireew
А Вы википедию смотрели? ;-)

И заодно посмотрите smoothsort (плавная сортировка)...

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 17:41 


07/10/15

2400
Geen в сообщении #1328537 писал(а):
Andrey_Kireew
А Вы википедию смотрели?


конечно, куда же сейчас без неё :)

про smoothsort - спасибо, почитаю!

но мой вопрос вообще имеет свои корни: "порывшись" в своих исходниках - нашел там, среди прочих, Merge Sort, код небольшой, примерно как и в "Вики" по объёму, но в нём нет никакой рекурсии. Я подумал, что недоработанный - проверил - работает. Сравнил со скоростью sort из matlab на 10000000 случайных семплах - скорость примерно сопоставимая (Shell Sort при этом проигрывает в 200 раз).

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 17:51 
Заслуженный участник
Аватара пользователя


01/09/13
4319
Andrey_Kireew в сообщении #1328542 писал(а):
конечно, куда же сейчас без неё :)

Так там же описано как реализовать без рекурсии...

Andrey_Kireew в сообщении #1328542 писал(а):
Сравнил со скоростью sort из matlab на 10000000 случайных семплах

Помниться, у меня smoothsort обгонял на больших и примерно отсортированных массивах... (кажется, по крайней мере тогда, MatLab использовал быструю сортировку)

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 18:02 


07/10/15

2400
Geen в сообщении #1328546 писал(а):
Так там же описано как реализовать без рекурсии...


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

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 18:26 
Заслуженный участник


16/02/13
4112
Владивосток
Andrey_Kireew в сообщении #1328534 писал(а):
проблемы с устойчивостью
На всякий случай: если под устойчивостью понимается устойчивость сортировки, то она не зависит от рекурсии/итерации. Только от алгоритма. И, кстати, как пирамидальная, так и, подозреваю, smoothsort неустойчивы.

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 18:34 
Заслуженный участник
Аватара пользователя


01/09/13
4319
iifat в сообщении #1328551 писал(а):
smoothsort неустойчивы.

Да, неустойчива.
Но любую неустойчивую можно сделать устойчивой добавлением к ключу сравнения индекса в исходном массиве. Но если надо "синхронно" переупорядочить несколько массивов сортируя один из них, то это даже "бесплатно" :-)

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 20:03 


14/01/11
2919
Есть ещё timsort, она, если не изменяет память, устойчива.

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 20:13 


07/10/15

2400
Да нет, под устойчивостью я подразумевал не сохранение порядка, а что то ближе к тому, о чём упомянул mihaild.

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 20:15 
Заслуженный участник
Аватара пользователя


16/07/14
8465
Цюрих
Я вроде бы ничего не упоминал в этом смысле. По крайней мере, что вы понимаете под устойчивостью, я до сих пор не понимаю.

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 20:47 
Заслуженный участник


20/08/14
11177
Россия, Москва
Возможно подразумевалась глубина стека рекурсии в зависимости от размера и содержимого сортируемого массива. Но смысл её точной оценки и постоянства непонятна, обычно достаточно оценить сверху (это просто) и всё, мало кого волнует выделить 1К или 10К памяти (я так вообще на цифры расхода памяти до единиц мегабайтов внимания не обращаю :mrgreen:).

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение24.07.2018, 21:38 
Заслуженный участник
Аватара пользователя


01/09/13
4319
Sender в сообщении #1328559 писал(а):
Есть ещё timsort, она, если не изменяет память, устойчива.

Да, но не нравятся мне в нём эвристики...

(и особенно "радует" упоминание о том, что три его имплементации работали некорректно :mrgreen: )

 Профиль  
                  
 
 Re: Merge Sort без рекурсии
Сообщение25.07.2018, 02:47 
Заслуженный участник


16/02/13
4112
Владивосток
Краше цифровой всё равно нету :wink:

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group