Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何在prolog中对列表列表进行快速排序?_Sorting_Prolog_Quicksort_Nested Lists - Fatal编程技术网

Sorting 如何在prolog中对列表列表进行快速排序?

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]

我试图用列表列表在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]

这是目前最接近的方法:

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进行比较。。。