Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
List 在Prolog中对列表排序_List_Sorting_Prolog - Fatal编程技术网

List 在Prolog中对列表排序

List 在Prolog中对列表排序,list,sorting,prolog,List,Sorting,Prolog,Prolog有一种独特的处理方式,特别是因为实际上每个操作都涉及某种递归 每种语言都有一个经典的例子,就是将整数列表按升序排序 什么是对随机整数列表进行排序的最佳方法(不使用太多内置谓词,这当然排除了sort/2谓词)?Roman Barták的Prolog编程站点给出了一个优化的快速排序 quick_sort2(List,Sorted):-q_sort(List,[],Sorted). q_sort([],Acc,Acc). q_sort([H|T],Acc,Sorted):- piv

Prolog有一种独特的处理方式,特别是因为实际上每个操作都涉及某种递归

每种语言都有一个经典的例子,就是将整数列表按升序排序


什么是对随机整数列表进行排序的最佳方法(不使用太多内置谓词,这当然排除了sort/2谓词)?

Roman Barták的Prolog编程站点给出了一个优化的快速排序

quick_sort2(List,Sorted):-q_sort(List,[],Sorted).
q_sort([],Acc,Acc).
q_sort([H|T],Acc,Sorted):-
    pivoting(H,T,L1,L2),
    q_sort(L1,Acc,Sorted1),q_sort(L2,[H|Sorted1],Sorted)

据我所知,最好的排序算法是直接用Prolog编写的,没有参考任何特殊的内置函数,而是使用某种形式的合并排序

一个常见的优化是开始合并长度不是1的列表,而是已经排序的段

也就是说,要对列表进行排序,
[4,5,3,6,2,7,1,2]
,将合并列表
[4,5]
[3,6]
[2,7]
[1,2]

这可以通过不仅在升序方向上,而且在另一个方向上组合排序列表来进一步优化。对于上面的示例,这意味着排序段的组装如下:

[4,5|_]
[3,4,5|_]
[3,4,5,6|_]
...
请注意,在Prolog中,在开始和结束时都可以直接扩展列表

因此,我们只能合并
[1,2,3,4,5,6,7]
[2]

使用Richard O'Keefe的原始实现(~1984年)的当前系统位于


ciao-1.15/lib/sort.pl

只需注意:该谓词(使用链接中实现的pivoting/4)执行降序排序,您必须反转pivoting/4的比较运算符才能执行升序排序。@j4nbur53:下载ciao的当前版本。我最喜欢的是用于排序的树,另请参阅,但是Prolog树比Java树涉及更多的复制。