| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [Prolog]Сортировка бинарными включениями |
| Автор: Proksima 24.11.2006, 02:10 |
| Помогите, пожалуйста, написать на прологе сортировку бинарными включенниями. Заранее благодарю. |
| Автор: skyboy 24.11.2006, 11:12 |
| опиши алгоритм. постараюсь помочь. |
| Автор: Proksima 24.11.2006, 21:00 | ||||
| Метод прямых вставок: Делаются проходы по части списка, и в его начале "вырастает" отсортированная последовательность. Можно считать, что эта последовательность упорядочена. По ходу алгоритма в нее будут вставляться все новые элементы. Поиск подходящего места для очередного элемента входной последовательности осуществляется путем последовательных сравнений с элементом, стоящим перед ним. В зависимости от результата сравнения элемент либо остается на текущем месте(вставка завершена), либо они меняются местами и процесс повторяется. Алгоритм сортировки бинарными включениями представляет из себя оптимизированную версию алгоритма сортировки простыми вставками, отличие заключается в том, что при поиске место, на которое надо вставить элемент ai в уже упорядоченную совокупность a0 , ..., ai-1 , определяется алгоритмом деления пополам (отсюда и название алгоритма "бинарные включения" здесь понимаем как "включения делением пополам"). Вот сам алгоритм:
Эту же сортировку когда-то описывала на лиспе. Было задание в одной из лабораторных работ... А вот с прологом что-то не заладилось... Можно помочь?
|
| Автор: Proksima 25.11.2006, 19:56 |
| Artemios, большое спасибо! |
| Автор: ImSassy 16.9.2009, 23:17 |
| Proksima, помоги, пожалйста, у тебя случайно не осталось этой сортировки на лиспе? А то мне нужно лабу сдавать, а я вообще бум-бум((( |
| Автор: Rodman 20.9.2009, 15:12 | ||
|
| Автор: brianosally 22.12.2010, 23:04 | ||||||||
%линеаризация(уничтожение многоуровневости списка к пр. [a,[b,[c]]] --> [a,b,c]) lineariz([H|L],L1):-lineariz(H,LS),lineariz(L,LS2),union_lists(LS,LS2,L1). lineariz([],[]). lineariz(H,[H]). [a,[b,[c]]] --> [a,b,c] [a,[b,[c]]] --> [a,b,c,[]] [a,[b,[c]]] --> [a,b,c,[],[]] [a,[b,[c]]] --> [a,b,c[],[],[]] ........................................... [a,[b,[c]]] --> [a,b,[c]] и т. д. Но если добавить ! в выражение, то обратный ход отсечется, как и куча лишних вариантов: %линеаризация(уничтожение многоуровневости списка к пр. [a,[b,[c]]] --> [a,b,c]) lineariz([H|L],L1):-lineariz(H,LS),lineariz(L,LS2),!,union_lists(LS,LS2,L1). lineariz([],[]). lineariz(H,[H]). результат : [a,[b,[c]]] --> [a,b,c] %второй вариант у меня так и не заработал, но может кто усовершенствует: %lineariz([[H|L]|H1],L2):-lineariz([H|[L|H1]],L2). %lineariz([H|[L|H1],[H|L2]):-lineariz([L|H1],[H|L2]). |