有条件的Prolog排序方法

时间:2013-11-10 02:12:56

标签: programming-languages prolog

我是prolog语言的新手。我在prolog中遇到了一个有趣的问题。

通常,quicksort适用于大型列表。但对于较小的列表,插入排序比quicksort更好。如何在Prolog中编写使用quicksort的排序算法 最初,但切换到15个或更少元素的子列表的插入排序。

提示是我们可以在分区操作期间计算元素的数量。但我不知道如何形成这个问题的算法。任何人都可以指导/帮助。

提前多多感谢。

2 个答案:

答案 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)
 ; .....