Programming languages 条件Prolog排序方法

Programming languages 条件Prolog排序方法,programming-languages,prolog,Programming Languages,Prolog,我不熟悉prolog语言。我在序言中遇到了一个有趣的问题 一般来说,快速排序适用于大型列表。但对于较小的列表,插入排序比快速排序更有效。如何在Prolog中编写使用快速排序的排序算法 最初,但对于15个或更少元素的子列表切换为插入排序 提示是,我们可以在分区操作期间计算元素的数量。但我不知道如何形成这个问题的算法。谁能给我指点一下/帮助一下吗 非常感谢。您可以为mysort规则创建几个子句,根据列表长度选择算法,如下所示: mySort(In, Out) :- count(In, Cnt

我不熟悉prolog语言。我在序言中遇到了一个有趣的问题

一般来说,快速排序适用于大型列表。但对于较小的列表,插入排序比快速排序更有效。如何在Prolog中编写使用快速排序的排序算法 最初,但对于15个或更少元素的子列表切换为插入排序

提示是,我们可以在分区操作期间计算元素的数量。但我不知道如何形成这个问题的算法。谁能给我指点一下/帮助一下吗


非常感谢。

您可以为
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).
mySort(输入,输出):-
计数(单位:Cnt),
Cnt<15,
插入排序(输入、输出)。
mySort(输入、输出):-
计数(单位:Cnt),
Cnt>=15,
快速排序(输入、输出)。
快速排序(输入、输出):-
隔板(内、左、右),
mySort(左,SortedLeft),
mySort(右,右),
合并已分拣(SortedLeft、SORTDRIGHT、Out)。

诀窍是在对输入进行分区后,
quickSort/2
规则引用的是
sort
,而不是
quickSort
。这意味着一旦计数降至15以下,
insertionSort
将用于对较小的分区进行排序。

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)
 ; .....
部分([]、[]、[]、0、0)。
部分([P | LS],L,R,CL,CR):-部分(P,LS,L,[],R,[],0,CL,0,CR)。
零件(u,[]、LZ、LZ、RZ、RZ、CL、CL、CR、CR)。
第(P,[X | LS],L,LZ,R,RZ,IL,CL,JR,CR)部分:-
XL=[X | T],I2是IL+1,部分(P,LS,T,LZ,R,RZ,I2,CL,JR,CR)
; .....

是在某处定义的
count/2
,还是您的意思是
length/2
?@mbrach这是一个框架实现,因此
分区
合并排序
计数
由OP定义(或使用现有的
length/2
来定义
计数/2
)。OP需要
分区
来计算长度,以避免不必要的额外遍历。@WillNess这只是算法的一个框架-OP可以自由地对此进行优化,传递计数。关键在于这三个子句。sort/2是一个内置谓词。你不应该重新定义它。你用了什么序言?它必须是一个非常旧的版本。有关更有效的方法,请参阅