Prolog语言中的冒泡排序

时间:2011-01-20 23:02:06

标签: prolog bubble-sort

我必须实现冒泡排序功能(排序算法)。

我已经实施了bubblesortswapbubblesort的帮助功能:

swap([X,Y|T1],[Y,X|T1]):-(Y<X,!).
swap([X|T1],[X|T2]):- swap(T1,T2).

bubblesort([],[]) :- !.
bubblesort(T1,T2) :- (bubblesort(swap(T1,T2),T2)).

我得到一个无限循环。我必须保留该功能的签名:

  

冒泡(T1,T2)

我坚持这个问题2个小时。有谁知道我该怎么做?

5 个答案:

答案 0 :(得分:1)

问题是由递归查询引起的。查询bubblesort(T1, T2)时, 它查询bubblesort(swap(T1, T2), T2),然后通过bubblesort/2的第二个句子, bubblesort(swap(swap(T1, T2), T2'), T2)T2统一为T2,然后循环播放。 它永远不会得到swap(T1, T2)查询的第一个结果。

答案 1 :(得分:1)

在交换过程没有变化之前,请保持交换。如果交换没有变化,那么你已经对列表进行了排序。

bubblesort ( List, SortedList) :-
    swap ( List, List1 ), ! ,
    bubblesort ( List1, SortedList) .
bubblesort ( List, List).

swap ( [ X, Y | Rest ], [ Y, X | Rest ] ) :-
    X > Y, ! .
swap ( [ Z | Rest ], [ Z | Rest1 ] ) : -
    swap (Rest, Rest1 ).

答案 2 :(得分:0)

简单bubble sort algorithm由两个主循环组成:

  1. 遍历列表,“交换”每对元素,如果它们不是“按顺序”(内循环)。
  2. 对结果重复(1),直到列表完全排序(外循环)。
  3. 内环(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中使用的那样 - 这很重要,否则算法可能不会终止!)

答案 3 :(得分:0)

写一些效率低下的东西几乎很痛苦:

bubblesort(L, L1) :-
        (   bubble(L, L2)
        ->  bubblesort(L2, L1)
        ;   L = L1 ).

bubble([A, B|T], L) :-
        (   A > B
        ->  L = [B, A|T]
        ;   L = [A | L1],
            bubble([B|T], L1)).

:- bubblesort([2,4,2,3, 2, 6,6,3,1, 11, 2, 3, 1], Out).

答案 4 :(得分:-1)

bubblesort ( List, SortedList) :-
    swap ( List, List1 ), ! ,
    bubblesort ( List1, SortedList) .
bubblesort ( List, List).