:- use_module(library(lists)).
% ----------------------------
% задание 1: шелл (седжвик)
% ----------------------------
% shs(+l, -s)
shs(L, S) :-
length(L, N),
sg(N, Gs),
sp(Gs, L, S).
% sg(+n, -gs)
sg(N, Gs) :-
( N =< 1 -> Gs = [1]
; sgk(N, 0, [], Rs),
reverse(Rs, Gs)
).
sgk(N, K, A, Rs) :-
hk(K, H),
hk(K1, H1),
( 3*H1 > N ->
Rs = [H|A]
; sgk(N, K1, [H|A], Rs)
).
% hk(+k,-h)
hk(K, H) :-
).
sp([], L, L).
sp([G|Gs], L, S) :-
gp(G, L, L1),
sp(Gs, L1, S).
% gp(+g,+l,-s)
gp(G, L, S) :-
en(L, 0, Ps),
findall(Ns
, (between
(0, G1
, R
), cls
(Ps
, G
, R
, Ns
)), Bs
), append(Bs, All),
keysort(All, Ss),
vs(Ss, S).
cls(Ps, G, R, Ns) :-
iv(Cs, Vs1, Is1),
ins(Vs1, Vs2),
pi(Is1, Vs2, Ns).
pr
(G
, R
, I
-_
) :- 0 is (I
- R
) mod G
.
en([], _, []).
en([X|Xs], I, [I-X|Ps]) :-
en(Xs, I1, Ps).
iv([], [], []).
iv
([I
-V
|T
], [V
|Vs
], [I
|Is]) :- iv
(T
, Vs
, Is).
pi([], [], []).
pi
([I
|Is], [V
|Vs
], [I
-V
|T
]) :- pi
(Is, Vs
, T
).
vs([], []).
vs([_-V|T], [V|Vs]) :- vs(T, Vs).
% ins(+l,-s)
ins([], []).
ins([X|Xs], S) :- ins(Xs, S1), is1(X, S1, S).
% ----------------------------
% Аналитическая оценка сложности сортировки Шелла (Sedgewick's sequence)
% ----------------------------
% В среднем, для последовательности Седжвика, оценка O(N^(4/3)). Это эмпирически полученная оценка.
% В худшем случае (для других шагов) может быть O(N^(3/2)).
shellsort_complexity_analysis(Complexity) :-
Complexity = 'В среднем O(N^(4/3)). В худшем случае (для других шагов) O(N^(3/2)).'.
% Пример использования сортировки Шелла
% ----------------------------
% задание 2: бинарные включения
% ----------------------------
% bis(+l,-s)
bis(L, S) :- bis1(L, [], S).
bis1([], A, A).
bis1([X|Xs], A, S) :-
bin_ins(X, A, A1),
bis1(Xs, A1, S).
% bin_ins(+x,+l,-r)
bin_ins(X, L, R) :-
length(L, N),
bin_pos(X, L, 0, N, P),
sp2(P, L, A, B),
append(A, [X|B], R).
% bin_pos(+x,+l,+lo,+hi,-p)
bin_pos(X, L, Lo, Hi, P) :-
( Lo >= Hi ->
P = Lo
nth0(M, L, V),
( X =< V ->
bin_pos(X, L, Lo, M, P)
bin_pos(X, L, M1, Hi, P)
)
).
% sp2(+k,+l,-a,-b)
sp2(0, L, [], L) :- !.
sp2(K, [X|Xs], [X|A], B) :-
K > 0,
sp2(K1, Xs, A, B).
% ----------------------------
% Аналитическая оценка сложности бинарной вставки
% ----------------------------
% Общая сложность: N * (O(log N) + O(N)) = O(N log N + N^2) = O(N^2)
binary_insertion_complexity_analysis(Complexity) :-
Complexity = 'O(N^2) в худшем и среднем случаях.'.
% ----------------------------
% Сравнение алгоритмов
% ----------------------------
compare_sort_algorithms :-
shellsort_complexity_analysis(ShellComplexity),
binary_insertion_complexity_analysis(BinaryComplexity),
format('Сравнение алгоритмов сортировки:~n', []),
format(' Сортировка Шелла (Sedgewick): ~w~n', [ShellComplexity]),
format(' Сортировка бинарными включениями: ~w~n', [BinaryComplexity]),
format('~n',[]),
format(' Для больших списков, сортировка Шелла (в среднем) более эффективна, чем сортировка бинарными включениями.~n',[]),
format(' Для небольших списков, константы, скрытые в O-нотации, могут сделать бинарные включения быстрее.~n',[]),
format('~n',[]),
format('Пример использования для списка L = [5, 2, 8, 1, 9, 4]:~n', []), % Добавляем пример
L = [5, 2, 8, 1, 9, 4],
shs(L, SortedShell),
bis(L, SortedBinary),
format(' Исходный список: ~w~n', [L]),
format(' Сортировка Шелла дает: ~w~n', [SortedShell]),
format(' Бинарные включения дают: ~w~n', [SortedBinary]),
format('Сортировки дают одинаковый результат, но сложность алгоритмов разная. Для больших списков сортировка Шелла будет работать быстрее.~n',[]).
% Запуск сравнения
start :-
compare_sort_algorithms.
Oi0gdXNlX21vZHVsZShsaWJyYXJ5KGxpc3RzKSkuCgolIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJSDQt9Cw0LTQsNC90LjQtSAxOiDRiNC10LvQuyAo0YHQtdC00LbQstC40LopCiUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKJSBzaHMoK2wsIC1zKQpzaHMoTCwgUykgOi0KICAgIGxlbmd0aChMLCBOKSwKICAgIHNnKE4sIEdzKSwKICAgIHNwKEdzLCBMLCBTKS4KCiUgc2coK24sIC1ncykKc2coTiwgR3MpIDotCiAgICAoIE4gPTwgMSAtPiBHcyA9IFsxXQogICAgOyBzZ2soTiwgMCwgW10sIFJzKSwKICAgICAgcmV2ZXJzZShScywgR3MpCiAgICApLgoKc2drKE4sIEssIEEsIFJzKSA6LQogICAgaGsoSywgSCksCiAgICBLMSBpcyBLICsgMSwKICAgIGhrKEsxLCBIMSksCiAgICAoIDMqSDEgPiBOIC0+CiAgICAgICAgUnMgPSBbSHxBXQogICAgOyAgIHNnayhOLCBLMSwgW0h8QV0sIFJzKQogICAgKS4KCiUgaGsoK2ssLWgpCmhrKEssIEgpIDotCiAgICAoIDAgaXMgSyBtb2QgMiAtPgogICAgICAgIFAyayAgaXMgMSA8PCBLLAogICAgICAgIEsyICAgaXMgSyAvLyAyLAogICAgICAgIFAyazIgaXMgMSA8PCBLMiwKICAgICAgICBIIGlzIDkqUDJrIC0gOSpQMmsyICsgMQogICAgOyAgIFAyayAgaXMgMSA8PCBLLAogICAgICAgIEsyICAgaXMgKEsgKyAxKSAvLyAyLAogICAgICAgIFAyazIgaXMgMSA8PCBLMiwKICAgICAgICBIIGlzIDgqUDJrIC0gNipQMmsyICsgMQogICAgKS4KCnNwKFtdLCBMLCBMKS4Kc3AoW0d8R3NdLCBMLCBTKSA6LQogICAgZ3AoRywgTCwgTDEpLAogICAgc3AoR3MsIEwxLCBTKS4KCiUgZ3AoK2csK2wsLXMpCmdwKEcsIEwsIFMpIDotCiAgICBlbihMLCAwLCBQcyksCiAgICBHMSBpcyBHIC0gMSwKICAgIGZpbmRhbGwoTnMsIChiZXR3ZWVuKDAsIEcxLCBSKSwgY2xzKFBzLCBHLCBSLCBOcykpLCBCcyksCiAgICBhcHBlbmQoQnMsIEFsbCksCiAgICBrZXlzb3J0KEFsbCwgU3MpLAogICAgdnMoU3MsIFMpLgoKY2xzKFBzLCBHLCBSLCBOcykgOi0KICAgIGluY2x1ZGUocHIoRywgUiksIFBzLCBDcyksCiAgICBpdihDcywgVnMxLCBJczEpLAogICAgaW5zKFZzMSwgVnMyKSwKICAgIHBpKElzMSwgVnMyLCBOcykuCgpwcihHLCBSLCBJLV8pIDotIDAgaXMgKEkgLSBSKSBtb2QgRy4KCmVuKFtdLCBfLCBbXSkuCmVuKFtYfFhzXSwgSSwgW0ktWHxQc10pIDotCiAgICBJMSBpcyBJICsgMSwKICAgIGVuKFhzLCBJMSwgUHMpLgoKaXYoW10sIFtdLCBbXSkuCml2KFtJLVZ8VF0sIFtWfFZzXSwgW0l8SXNdKSA6LSBpdihULCBWcywgSXMpLgoKcGkoW10sIFtdLCBbXSkuCnBpKFtJfElzXSwgW1Z8VnNdLCBbSS1WfFRdKSA6LSBwaShJcywgVnMsIFQpLgoKdnMoW10sIFtdKS4KdnMoW18tVnxUXSwgW1Z8VnNdKSA6LSB2cyhULCBWcykuCgolIGlucygrbCwtcykKaW5zKFtdLCBbXSkuCmlucyhbWHxYc10sIFMpIDotIGlucyhYcywgUzEpLCBpczEoWCwgUzEsIFMpLgoKJSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiUg0JDQvdCw0LvQuNGC0LjRh9C10YHQutCw0Y8g0L7RhtC10L3QutCwINGB0LvQvtC20L3QvtGB0YLQuCDRgdC+0YDRgtC40YDQvtCy0LrQuCDQqNC10LvQu9CwIChTZWRnZXdpY2sncyBzZXF1ZW5jZSkKJSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgolINCSINGB0YDQtdC00L3QtdC8LCDQtNC70Y8g0L/QvtGB0LvQtdC00L7QstCw0YLQtdC70YzQvdC+0YHRgtC4INCh0LXQtNC20LLQuNC60LAsINC+0YbQtdC90LrQsCBPKE5eKDQvMykpLiAg0K3RgtC+INGN0LzQv9C40YDQuNGH0LXRgdC60Lgg0L/QvtC70YPRh9C10L3QvdCw0Y8g0L7RhtC10L3QutCwLgolINCSINGF0YPQtNGI0LXQvCDRgdC70YPRh9Cw0LUgKNC00LvRjyDQtNGA0YPQs9C40YUg0YjQsNCz0L7Qsikg0LzQvtC20LXRgiDQsdGL0YLRjCBPKE5eKDMvMikpLgoKc2hlbGxzb3J0X2NvbXBsZXhpdHlfYW5hbHlzaXMoQ29tcGxleGl0eSkgOi0KICAgIENvbXBsZXhpdHkgPSAn0JIg0YHRgNC10LTQvdC10LwgTyhOXig0LzMpKS4g0JIg0YXRg9C00YjQtdC8INGB0LvRg9GH0LDQtSAo0LTQu9GPINC00YDRg9Cz0LjRhSDRiNCw0LPQvtCyKSBPKE5eKDMvMikpLicuCgolINCf0YDQuNC80LXRgCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDRgdC+0YDRgtC40YDQvtCy0LrQuCDQqNC10LvQu9CwCgolIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJSDQt9Cw0LTQsNC90LjQtSAyOiDQsdC40L3QsNGA0L3Ri9C1INCy0LrQu9GO0YfQtdC90LjRjwolIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiUgYmlzKCtsLC1zKQpiaXMoTCwgUykgOi0gYmlzMShMLCBbXSwgUykuCgpiaXMxKFtdLCBBLCBBKS4KYmlzMShbWHxYc10sIEEsIFMpIDotCiAgICBiaW5faW5zKFgsIEEsIEExKSwKICAgIGJpczEoWHMsIEExLCBTKS4KCiUgYmluX2lucygreCwrbCwtcikKYmluX2lucyhYLCBMLCBSKSA6LQogICAgbGVuZ3RoKEwsIE4pLAogICAgYmluX3BvcyhYLCBMLCAwLCBOLCBQKSwKICAgIHNwMihQLCBMLCBBLCBCKSwKICAgIGFwcGVuZChBLCBbWHxCXSwgUikuCgolIGJpbl9wb3MoK3gsK2wsK2xvLCtoaSwtcCkKYmluX3BvcyhYLCBMLCBMbywgSGksIFApIDotCiAgICAoIExvID49IEhpIC0+CiAgICAgICAgUCA9IExvCiAgICA7IE0gaXMgKExvICsgSGkpIC8vIDIsCiAgICAgIG50aDAoTSwgTCwgViksCiAgICAgICggWCA9PCBWIC0+CiAgICAgICAgICBiaW5fcG9zKFgsIEwsIExvLCBNLCBQKQogICAgICA7IE0xIGlzIE0gKyAxLAogICAgICAgIGJpbl9wb3MoWCwgTCwgTTEsIEhpLCBQKQogICAgICApCiAgICApLgoKJSBzcDIoK2ssK2wsLWEsLWIpCnNwMigwLCBMLCBbXSwgTCkgOi0gIS4Kc3AyKEssIFtYfFhzXSwgW1h8QV0sIEIpIDotCiAgICBLID4gMCwKICAgIEsxIGlzIEsgLSAxLAogICAgc3AyKEsxLCBYcywgQSwgQikuCgolIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJSDQkNC90LDQu9C40YLQuNGH0LXRgdC60LDRjyDQvtGG0LXQvdC60LAg0YHQu9C+0LbQvdC+0YHRgtC4INCx0LjQvdCw0YDQvdC+0Lkg0LLRgdGC0LDQstC60LgKJSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgolICDQntCx0YnQsNGPINGB0LvQvtC20L3QvtGB0YLRjDogIE4gKiAoTyhsb2cgTikgKyBPKE4pKSA9IE8oTiBsb2cgTiArIE5eMikgPSBPKE5eMikKCmJpbmFyeV9pbnNlcnRpb25fY29tcGxleGl0eV9hbmFseXNpcyhDb21wbGV4aXR5KSA6LQogICAgQ29tcGxleGl0eSA9ICdPKE5eMikg0LIg0YXRg9C00YjQtdC8INC4INGB0YDQtdC00L3QtdC8INGB0LvRg9GH0LDRj9GFLicuCgolIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJSDQodGA0LDQstC90LXQvdC40LUg0LDQu9Cz0L7RgNC40YLQvNC+0LIKJSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjb21wYXJlX3NvcnRfYWxnb3JpdGhtcyA6LQogICAgc2hlbGxzb3J0X2NvbXBsZXhpdHlfYW5hbHlzaXMoU2hlbGxDb21wbGV4aXR5KSwKICAgIGJpbmFyeV9pbnNlcnRpb25fY29tcGxleGl0eV9hbmFseXNpcyhCaW5hcnlDb21wbGV4aXR5KSwKICAgIGZvcm1hdCgn0KHRgNCw0LLQvdC10L3QuNC1INCw0LvQs9C+0YDQuNGC0LzQvtCyINGB0L7RgNGC0LjRgNC+0LLQutC4On5uJywgW10pLAogICAgZm9ybWF0KCcgINCh0L7RgNGC0LjRgNC+0LLQutCwINCo0LXQu9C70LAgKFNlZGdld2ljayk6IH53fm4nLCBbU2hlbGxDb21wbGV4aXR5XSksCiAgICBmb3JtYXQoJyAg0KHQvtGA0YLQuNGA0L7QstC60LAg0LHQuNC90LDRgNC90YvQvNC4INCy0LrQu9GO0YfQtdC90LjRj9C80Lg6IH53fm4nLCBbQmluYXJ5Q29tcGxleGl0eV0pLAogICAgZm9ybWF0KCd+bicsW10pLAogICAgZm9ybWF0KCcgINCU0LvRjyDQsdC+0LvRjNGI0LjRhSDRgdC/0LjRgdC60L7Qsiwg0YHQvtGA0YLQuNGA0L7QstC60LAg0KjQtdC70LvQsCAo0LIg0YHRgNC10LTQvdC10LwpINCx0L7Qu9C10LUg0Y3RhNGE0LXQutGC0LjQstC90LAsINGH0LXQvCDRgdC+0YDRgtC40YDQvtCy0LrQsCDQsdC40L3QsNGA0L3Ri9C80Lgg0LLQutC70Y7Rh9C10L3QuNGP0LzQuC5+bicsW10pLAogICAgZm9ybWF0KCcgINCU0LvRjyDQvdC10LHQvtC70YzRiNC40YUg0YHQv9C40YHQutC+0LIsINC60L7QvdGB0YLQsNC90YLRiywg0YHQutGA0YvRgtGL0LUg0LIgTy3QvdC+0YLQsNGG0LjQuCwg0LzQvtCz0YPRgiDRgdC00LXQu9Cw0YLRjCDQsdC40L3QsNGA0L3Ri9C1INCy0LrQu9GO0YfQtdC90LjRjyDQsdGL0YHRgtGA0LXQtS5+bicsW10pLAogICAgZm9ybWF0KCd+bicsW10pLAogICAgICAgZm9ybWF0KCfQn9GA0LjQvNC10YAg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0LTQu9GPINGB0L/QuNGB0LrQsCBMID0gWzUsIDIsIDgsIDEsIDksIDRdOn5uJywgW10pLCAgICUg0JTQvtCx0LDQstC70Y/QtdC8INC/0YDQuNC80LXRgAogICAgTCA9IFs1LCAyLCA4LCAxLCA5LCA0XSwKICAgIHNocyhMLCBTb3J0ZWRTaGVsbCksCiAgICBiaXMoTCwgU29ydGVkQmluYXJ5KSwKICAgIGZvcm1hdCgnICDQmNGB0YXQvtC00L3Ri9C5INGB0L/QuNGB0L7Qujogfnd+bicsIFtMXSksCiAgICBmb3JtYXQoJyAg0KHQvtGA0YLQuNGA0L7QstC60LAg0KjQtdC70LvQsCDQtNCw0LXRgjogfnd+bicsIFtTb3J0ZWRTaGVsbF0pLAogICAgZm9ybWF0KCcgINCR0LjQvdCw0YDQvdGL0LUg0LLQutC70Y7Rh9C10L3QuNGPINC00LDRjtGCOiB+d35uJywgW1NvcnRlZEJpbmFyeV0pLAogICAgIGZvcm1hdCgn0KHQvtGA0YLQuNGA0L7QstC60Lgg0LTQsNGO0YIg0L7QtNC40L3QsNC60L7QstGL0Lkg0YDQtdC30YPQu9GM0YLQsNGCLCDQvdC+INGB0LvQvtC20L3QvtGB0YLRjCDQsNC70LPQvtGA0LjRgtC80L7QsiDRgNCw0LfQvdCw0Y8uINCU0LvRjyDQsdC+0LvRjNGI0LjRhSDRgdC/0LjRgdC60L7QsiDRgdC+0YDRgtC40YDQvtCy0LrQsCDQqNC10LvQu9CwINCx0YPQtNC10YIg0YDQsNCx0L7RgtCw0YLRjCDQsdGL0YHRgtGA0LXQtS5+bicsW10pLgoKJSDQl9Cw0L/Rg9GB0Log0YHRgNCw0LLQvdC10L3QuNGPCnN0YXJ0IDotCiAgICBjb21wYXJlX3NvcnRfYWxnb3JpdGhtcy4=