我是prolog语言的新手。我在prolog中遇到了一个有趣的问题。
通常,quicksort适用于大型列表。但对于较小的列表,插入排序比quicksort更好。如何在Prolog中编写使用quicksort的排序算法 最初,但切换到15个或更少元素的子列表的插入排序。
提示是我们可以在分区操作期间计算元素的数量。但我不知道如何形成这个问题的算法。任何人都可以指导/帮助。
提前多多感谢。
答案 0 :(得分:1)
您可以根据列表的长度为mysort
规则选择算法制定几个子句,如下所示:
mySort(In, Out) :-
count(In, Cnt),
Cnt < 15,
insertionSort(In, Out).
mySort(In, Out) :-
count(In, Cnt),
Cnt >= 15,
quickSort(In, Out).
quickSort(In, Out) :-
partition(In, Left, Right),
mySort(Left, SortedLeft),
mySort(Right, SortedRight),
mergeSorted(SortedLeft, SortedRight, Out).
诀窍是quickSort/2
规则在对输入进行分区后引用sort
,而不引用quickSort
。这意味着一旦计数降至15以下,insertionSort
将用于对较小的分区进行排序。
答案 1 :(得分:1)
partition
将每个元素放到一个或另一个子列表中。所以只需维护另外两个参数,这些参数是子列表的计数,从0开始,并在将另一个元素添加到其子列表时递增相应的计数器:
part([] ,[],[],0 ,0).
part([P|LS],L , R,CL,CR):- part(P,LS,L,[],R,[],0,CL,0,CR).
part(_,[] ,LZ,LZ,RZ,RZ,CL,CL,CR,CR).
part(P,[X|LS],L ,LZ,R ,RZ,IL,CL,JR,CR):-
X < P -> L=[X|T],I2 is IL+1, part(P,LS,T,LZ,R,RZ,I2,CL,JR,CR)
; .....