我必须实现冒泡排序功能(排序算法)。
我已经实施了bubblesort
和swap
,bubblesort
的帮助功能:
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个小时。有谁知道我该怎么做?
答案 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)可以这样表达:
% 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).