Sorting 如何在prolog中对列表列表进行快速排序?
我试图用列表列表在Prolog中实现快速排序,使用第4个元素作为键,但它没有像我所做的那样工作 例如:Sorting 如何在prolog中对列表列表进行快速排序?,sorting,prolog,quicksort,nested-lists,Sorting,Prolog,Quicksort,Nested Lists,我试图用列表列表在Prolog中实现快速排序,使用第4个元素作为键,但它没有像我所做的那样工作 例如: ?-qsort([[a,b,c,5],[d,e,f,10],[g,h,i,5],[j,k,l,1],[m,n,o,25]],排序)。 预期结果: [[j,k,l,1],[a,b,c,5],[g,h,i,5],[d,e,f,10],[m,n,o,25]。 我得到的答案(我需要修正括号): Sort=[j,k,l,1,[g,h,i,5],[a,b,c,5],[d,e,f,10],m,n,o,25]
?-qsort([[a,b,c,5],[d,e,f,10],[g,h,i,5],[j,k,l,1],[m,n,o,25]],排序)。
预期结果:
[[j,k,l,1],[a,b,c,5],[g,h,i,5],[d,e,f,10],[m,n,o,25]。
我得到的答案(我需要修正括号):
Sort=[j,k,l,1,[g,h,i,5],[a,b,c,5],[d,e,f,10],m,n,o,25]
这是目前最接近的方法:
last([Y],Y).
last([_|Xs],Y) :- last(Xs,Y).
qsort([],[]):- !.
qsort([X], [X]).
qsort([Head|Tail],Sorted):-
last(Head,Pivot),
separation(Pivot,Tail,Lesser,Greater),
qsort(Lesser,LesserSorted),
qsort(Greater,GreaterSorted),
append(LesserSorted,[Head|GreaterSorted],Sorted).
separation(_,[],[],[]).
separation(Pivot,[X|T],[X|Lesser],Greater):-
last(X,R), R =< Pivot,
separation(Pivot,T,Lesser,Greater).
separation(Pivot,[X|T],Lesser,[X|Greater]):-
last(X,R), R > Pivot,
separation(Pivot,T,Lesser,Greater).
last([Y],Y)。
last([|Xs],Y):-last(Xs,Y)。
qsort([],[]):-!。
qsort([X],[X])。
qsort([Head | Tail],已排序):-
最后(头部、枢轴),
分离(枢轴、尾部、较小、较大),
qsort(较小,较小),
qsort(更大,更大),
追加(LesserSorted,[Head | GreaterSorted],Sorted)。
分离(u,[],[],[])。
分离(枢轴,[X | T],[X |较小],较大):-
最后(X,R),R=枢轴,
分离(枢轴、T、较小、较大)。
这不是“pivot”的意思。您打算使用列表的第4个元素作为比较键对列表进行排序。“Pivot”是您选择用作分割器的元素,用于分区。您的元素恰好是4字段元组(碰巧编码为列表)。因此,您选择列表中的第一个元素作为轴心,并使用元素的第四个字段将它们与轴心元素的第四个字段进行比较。轴和键是两个独立的概念
具体来说
qsort([Head | Tail],已排序):-
最后(头部、枢轴),
%%这个:vvv
分离(枢轴、[头|尾]、较小、较大),
一定是这个
分离(枢轴、尾部、较小、较大),
%% ^^^^
qsort(较小,较小),
qsort(更大,更大),
因为这里
append(lessersorded,[Head | greatersorded],Sorted)。
%% ^^^^
您假定它在分区之前已从列表中删除(实际上应该是这样)。使用
@=
:@WillemVanOnsem我使用了您所说的,但程序已崩溃,并显示一条消息“参数未充分实例化”但是你没有首先选择一个轴,这正是我所做的…分离(轴,[X | T],[X |小],[X |大):-[,,C],C=<轴,分离(轴,T,小,大)。分离(Pivot,[X | T],less,[X | bether]):-[,,C],C@>分离,分离(Pivot,T,less,bether)。为什么从分离/4调用last/2?您应该将X与Pivot进行比较。。。