Сортировка списка в прологе
Prolog имеет уникальный способ обработки вещей, тем более, что практически каждая операция включает в себя рекурсию того или иного рода.
одним из классических примеров каждого языка является сортировка списка целых чисел в порядке возрастания.
каков оптимальный способ (без использования слишком много встроенных предикатов, что исключает предикат sort/2, Конечно) для сортировки случайного списка целых чисел?
2 ответов
сайт программирования Prolog Романа Бартака дает примеры различных алгоритмов сортировки, заканчивая оптимизированным quicksort.
quick_sort2(List,Sorted):-q_sort(List,[],Sorted).
q_sort([],Acc,Acc).
q_sort([H|T],Acc,Sorted):-
pivoting(H,T,L1,L2),
q_sort(L1,Acc,Sorted1),q_sort(L2,[H|Sorted1],Sorted)
насколько я знаю, лучшие алгоритмы сортировки, написанные в Prolog напрямую, без ссылки на какие-либо специальные встроенные модули используют некоторую форму сортировки слияния.
частая оптимизация - начать слияние не со списками длины 1, а с уже отсортированными сегментами.
то есть отсортировать список [4,5,3,6,2,7,1,2]
списки [4,5]
,[3,6]
,[2,7]
,[1,2]
будут объединены.
это можно оптимизировать еще больше, собирая сортированные списки не только по возрастанию направлении, но и в другом направлении. В приведенном выше примере это означает, что отсортированный сегмент собирается следующим образом:
[4,5|_]
[3,4,5|_]
[3,4,5,6|_]
...
обратите внимание, что в Prolog прямо вперед, чтобы расширить список как в начале, так и в конце.
таким образом, мы должны объединить [1,2,3,4,5,6,7]
и [2]
только.
текущая система, которая использует оригинальную реализацию (~1984) Ричарда О'Кифа, является Чао-Пролог на
ciao-1.15/lib/sort.pl
.