Простой bubble sort algorithm состоит из двух основных циклов:
- Traverse список «обменивать» каждую пару элементов, если они не являются «в порядке» (внутренний петля).
- Повторите (1) результат, пока список не будет полностью отсортирован (внешний контур).
Внутренний контур (1) может быть выражен следующим образом:
% performs a single pass of a bubble-sort on a list
do_bubble_sort([], []).
do_bubble_sort([X], [X]).
do_bubble_sort([X0,X1|Xs], [X0|Rem]) :-
X0 =< X1, !,
do_bubble_sort([X1|Xs], Rem).
do_bubble_sort([X0,X1|Xs], [X1|Rem]) :-
do_bubble_sort([X0|Xs], Rem).
do_bubble_sort/2
выше принимает список, и рекурсивно обменивает последовательные элементы вдоль списка, если они не удовлетворяют тест =<
(третий пункт). Этот внутренний цикл затем называется внешним предиката петли, bubble_sort/2
, как показано ниже:
% repeatedly performs a bubble sort on a list until it is sorted
bubble_sort(L, SL) :-
do_bubble_sort(L, L0),
(sorted_order(L0) ->
SL = L0
; bubble_sort(L0, SL)
).
Этот предикат принимает список входных и рекурсивно не применяется do_bubble_sort/2
, пока предикат sorted_order/1
преуспевает на результат, то есть, если список в конечном счете отсортированы. sorted_order/1
может быть определена следующим образом:
% checks a list of things are in sorted (ascending) order
sorted_order([]).
sorted_order([_]) :- !.
sorted_order([X0,X1|R]) :-
X0 =< X1,
sorted_order([X1|R]).
Этот предикат принимает список и рекурсивно проверяет, что каждая пара последовательных элементов в отсортированном порядке (путем испытания =<
, так же, как мы используем в do_bubble_sort/2
- это важно, в противном случае алгоритм не может прекратить)
Ahh Пролог ... __Bad__ воспоминания :) – orlp
Ahh BubbleSort ... Плохие воспоминания :) – winwaed
Ahh, BubbleSort и Пролог ... хорошие воспоминания;) – sharky