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