Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
Algorithm 哈斯克尔';s快速排序-它到底是什么?_Algorithm_Haskell_Quicksort - Fatal编程技术网

Algorithm 哈斯克尔';s快速排序-它到底是什么?

Algorithm 哈斯克尔';s快速排序-它到底是什么?,algorithm,haskell,quicksort,Algorithm,Haskell,Quicksort,正如他们所说。那么这个标准, quicksort::Ord a=>[a]->[a] 快速排序[]=[] 快速排序(p:xs)=(较小的快速排序)+[p]+(较大的快速排序) 哪里 较小=过滤器(=p)xs 它到底描述了什么算法/计算过程 它当然不是,因为缺少最具定义性的特性,即就地分区算法 (答案可能是众所周知的,但现在还不是这样) 更正:这个问题实际上是重复的:答案是已知的,所以毕竟:cf..这是链表的快速排序。 是的,这是快速排序,只是不到位。它匹配快速排序的高级算法,同时更改低级实现以

正如他们所说。那么这个标准,

quicksort::Ord a=>[a]->[a]
快速排序[]=[]
快速排序(p:xs)=(较小的快速排序)+[p]+(较大的快速排序)
哪里
较小=过滤器(=p)xs
它到底描述了什么算法/计算过程

它当然不是,因为缺少最具定义性的特性,即就地分区算法

(答案可能是众所周知的,但现在还不是这样)


更正:这个问题实际上是重复的:答案是已知的,所以毕竟:cf..

这是链表的快速排序。 是的,这是快速排序,只是不到位。它匹配快速排序的高级算法,同时更改低级实现以匹配链表的数据结构。这就是为什么它是链表的快速排序

我更愿意说“快速排序最初是为了就地工作而开发的”,而不是“真正的快速排序是就地完成的”。快速排序有许多变体,包括随机拾取轴以避免更糟糕的情况行为等。。这是一个合理、清晰的链表快速排序定义

这个定义与我们教英国16岁数学学生快速排序的方式完全吻合。(我们教授的是算法,而不是编程。)在很大程度上模糊了目的和设计,这就是为什么我们不教授这些细节,尽管我们距离教授函数式编程或链表还有一百万英里。(这并没有改变这样一个事实,即当您使用破坏性更新阵列时,对交换就地技巧算法是最好的。)


这个定义有一个时间代价,因为它为两个子列表遍历列表两次。当然可以将其重写为分区而不是过滤,但我认为这是优化而不是改变这里的基本算法quicksort。

所有就地算法在Haskell中都需要一些“仪式”,其中可变状态隐藏在单子后面。上面的算法是快速排序,只是没有到位。

预期的答案(来自)是这是“真正的砍伐树木排序”。事实证明,上面也提到了它。

它是在描述快速排序。您链接到的文章中没有证据表明,霍尔认为它不是快速排序,除非它已经就位。@AndrewC是的,那篇文章可能不是支持我观点的最佳选择。但是,这是可湿性粉剂。我的意思是(我看到它争论了很多次)它在最初的论文中是如何描述的-那里的划分算法非常具体,有交换和移动边界。根据这种观点,不存在(不可变)链表的快速排序。(对于可变的,我们可以创建一个单元格地址数组并交换单元格内容(当然不是在Haskell中)。相关:根据代码中的单词描述,是quicksort算法的实现。Tony Hoare的quicksort由其就地分区算法专门定义。对不起,我没有进一步强调,我已经编辑了这个问题。如果你已经知道你想听到什么(“这不是托尼·霍尔定义的快速排序”),你为什么要问?然而,由于您无法使用Haskell列表编写就地算法,因此,考虑到数据结构的选择,您的代码尽可能接近快速排序的概念。我不认为存在矛盾。问题是,“它不是一个X,但它是什么?”。好吧,当你(认为你)已经知道答案的时候,问一个问题就可以了,让别人知道。我真的没料到会有这样的争论。Tony Hoare的快速排序是由它的就地分区算法定义的。我已经编辑了这个问题。@WillNess,这个问题是通过使用过滤来定义的吗?我不这么认为。这个是通过过滤创建临时列表来定义的。否则,你会把它看得太高,忽略了重要的细节。当然,这样做完全可以,但不是为了这个问题看,我更专注于操作细节,这里。如果我的措辞不清楚,我很抱歉。即使是遍历列表一次的重写,-它们仍然没有进行分区,而是通过创建临时列表<代码>分区在操作上仍在做同样的事情-它将一个列表分成两个新的。@MariusKavansky In place意味着不制作列表的新副本。如果你在一台内存很小的机器上有大量的数据,这很重要。如果你从树排序中取出树,那么使用名称树排序的理由肯定比从快速排序中取出交换要少?按照这个逻辑,你可以称之为去包装快速排序。@AndrewC我真的不知道该怎么做,Andrew。我应该不接受吗?reddit讨论中的论点在某种程度上吸引了我。但是,我认为是这样的:我们可以将类型视为标记列表(来自Lisp角度)。树只是一个标签;当我们创建一棵树时,我们真正做的是,较小的树在左边,较大的树在右边。所以当我们分成两个组时,本质上和我们把它们放在树的两个分支中时是一样的——左分支和右分支。IOW树与三元组“同构”。@AndrewC但在原始的algo中,使用交换进行不同的分区。在树的任何一步中,我们都没有考虑将较小的树放在右边,然后将它们交换到左边——当我们创建树时,首先是空的,然后在树中逐个插入ELT,每个ELT要么向左,要么向右。。。顺便说一句,我认为deswappinged quicksort这个名字实际上非常好。很高兴你回来顺便说一句:)接受你认为最好的答案,而不是我认为最好的答案!这就是它的目的!我喜欢你本质上相同的论点,但我断言我们讨论的算法本质上也是相同的(在更高层次的推理中)