Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Prolog]Сортировка бинарными включениями


Автор: Proksima 24.11.2006, 02:10
Помогите, пожалуйста, написать на прологе сортировку бинарными включенниями.

Заранее благодарю. smile

Автор: skyboy 24.11.2006, 11:12
опиши алгоритм. постараюсь помочь.

Автор: Proksima 24.11.2006, 21:00
Метод прямых вставок: Делаются проходы по части списка, и в его начале "вырастает" отсортированная последовательность. Можно считать, что эта последовательность упорядочена. По ходу алгоритма в нее будут вставляться все новые элементы. Поиск подходящего места для очередного элемента входной последовательности осуществляется путем последовательных сравнений с элементом, стоящим перед ним.    В зависимости от результата сравнения элемент либо остается на текущем месте(вставка завершена), либо они меняются местами и процесс повторяется. 
Алгоритм сортировки бинарными включениями представляет из себя оптимизированную версию алгоритма сортировки простыми вставками, отличие заключается в том, что при поиске место, на которое надо вставить элемент ai  в уже упорядоченную совокупность a0 , ..., ai-1 , определяется алгоритмом деления пополам (отсюда и название алгоритма "бинарные включения" здесь понимаем как "включения делением пополам"). 
 
Вот сам алгоритм:

Код

Procedure Binary_Insertion(n:word; Var a:massiv);
Var
  i,j,l,r,m:word;

         x:item;

   BEGIN

         For i:=2 To n Do

         begin

               x:=a[i]; l:=1; r:=i-1;

               While l<=r Do

               begin

                  m:=(l+r) div 2;

                  If x.key<a[m].key Then r:=m-1

                                              Else l:=m+1

               end;

               For j:=i-1 DownTo l Do a[j+1]:=a[j];

               a[l]:=x

         end

   END;{Binary_Insertion}


Эту же сортировку когда-то описывала на лиспе. Было задание в одной из лабораторных работ... А вот с прологом что-то не заладилось...

Можно помочь?


M
Guedda
Не забывайте пользоваться кнопкой "Код"!

Автор: Artemios 25.11.2006, 19:34
Цитата(Proksima @  24.11.2006,  02:10 Найти цитируемый пост)
сортировку бинарными включенниями.

сделал немножко иначе, чем:

Цитата(Proksima @  24.11.2006,  21:00 Найти цитируемый пост)
Делаются проходы по части списка, и в его начале "вырастает" отсортированная последовательность.

а именно, построил бинарное дерево сортировки, а затем линеаризовал его:

Код

конкатенация( [], L, L ). % конкатенация списков
конкатенация( [X | L1], L2, [X | L3]) :- 
    конкатенация( L1, L2, L3).

линеаризация( [X|L], L1 ) :-  % Линеаризация многоуровневого списка
     линеаризация( X, H ),
     линеаризация( L, T ),
     конкатенация( H, T, L1 ).
линеаризация( [], [] ).
линеаризация( X, [X] ).

сорт_вставка( X, [], [[],X,[]] ). % сорированная вставка в бинарное дерево
сорт_вставка( X, [A,B,C], [A,B,D] ) :- 
    X >= B,
    сорт_вставка(X,C,D).
сорт_вставка( X, [A,B,C], [D,B,C] ) :- 
    X < B,
    сорт_вставка(X,A,D).

бинарное_дерево( [], [] ). % построение бинарного дерева сортировки
бинарное_дерево( [X|L], D ) :-
    бинарное_дерево(L,D1),
    сорт_вставка(X,D1,D).

бин_сортировка(L1,L2) :-
    бинарное_дерево(L1,D),
    линеаризация(D,L2).


Проверка:
Цитата

?- бин_сортировка([3,1,7,2,5,4,8,9],L).

L = [1, 2, 3, 4, 5, 7, 8, 9]

Yes
?-   

Автор: Proksima 25.11.2006, 19:56
Artemios, большое спасибо!

Автор: ImSassy 16.9.2009, 23:17
Proksima, помоги, пожалйста, у тебя случайно не осталось этой сортировки на лиспе? А то мне нужно лабу сдавать, а я вообще бум-бум(((

Автор: Rodman 20.9.2009, 15:12

M
Rodman
Модератор: Название темы должно отражать ее суть!

Автор: brianosally 22.12.2010, 23:04
Цитата(Artemios @ 25.11.2006,  19:34)
Цитата(Proksima @  24.11.2006,  02:10 Найти цитируемый пост)
сортировку бинарными включенниями.

сделал немножко иначе, чем:

Цитата(Proksima @  24.11.2006,  21:00 Найти цитируемый пост)
Делаются проходы по части списка, и в его начале "вырастает" отсортированная последовательность.

а именно, построил бинарное дерево сортировки, а затем линеаризовал его:

Код

конкатенация( [], L, L ). % конкатенация списков
конкатенация( [X | L1], L2, [X | L3]) :- 
    конкатенация( L1, L2, L3).

линеаризация( [X|L], L1 ) :-  % Линеаризация многоуровневого списка
     линеаризация( X, H ),
     линеаризация( L, T ),
     конкатенация( H, T, L1 ).
линеаризация( [], [] ).
линеаризация( X, [X] ).

сорт_вставка( X, [], [[],X,[]] ). % сорированная вставка в бинарное дерево
сорт_вставка( X, [A,B,C], [A,B,D] ) :- 
    X >= B,
    сорт_вставка(X,C,D).
сорт_вставка( X, [A,B,C], [D,B,C] ) :- 
    X < B,
    сорт_вставка(X,A,D).

бинарное_дерево( [], [] ). % построение бинарного дерева сортировки
бинарное_дерево( [X|L], D ) :-
    бинарное_дерево(L,D1),
    сорт_вставка(X,D1,D).

бин_сортировка(L1,L2) :-
    бинарное_дерево(L1,D),
    линеаризация(D,L2).


Проверка:
Цитата

?- бин_сортировка([3,1,7,2,5,4,8,9],L).

L = [1, 2, 3, 4, 5, 7, 8, 9]

Yes
?-   


%линеаризация(уничтожение многоуровневости списка к пр. [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]).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)