对两个元素进行重新排序的实际比较/交换在哪里?这是否由Ord
(有序)类型定义本身处理。那么类型强制执行这种被订购的条件?
是什么Ord
意思?
Ord
只是意味着a
应该与自身或更严格的操作(如>
, , )具有可比性<
,并且==
应该为a
. 您可以将其视为对方法的约束。
那么,在哪里下单呢?
答案是最后一个模式:
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs
在运行时,程序将获取一个数组,并且该数组必须满足以下两种模式之一:
模式 1#:它是空的,在这种情况下,函数返回相同的空数组并停止。
模式 2#:它不为空,或者换句话说,有一个 head 元素p
附加到一个 tailing array xs
。在这种情况下,函数被告知将其放在p
中间,将所有xs
小于的元素p
放在 的左侧(由 定义lesser
),将所有大于或等于的p
元素放在 的右侧。此外,函数最终被告知将自身(即相同的函数)应用于(如我们上面定义的,是 的左侧的数组)和(如我们上面定义的,是右侧的数组侧xs
p
p
quicksort
lesser
p
greater
p
)。如您所见,这将一直持续到您留下一个大小为零的数组并且模式 1# 终止该函数。
最后,每当这些递归调用终止时,函数将返回数组:
sortedlesser ++ p ++ sortedgreater
其中sortedlesser
是应用quicksort
on产生的数组lesser
,是应用onsortedgreater
产生的数组。quicksort
greater
等等……我们不是一次又一次地复制 p 吗?
'greater' 谓词定义了项目 '>= p' (枢轴),所以这是否意味着我们最终会在函数的结果列表中得到一个额外的枢轴 [p],因为 '++ [p ]' 物品?
不,这不是模式匹配的工作方式。这是说其中的所有元素xs
都大于或等于p
。顾名思义p
,它本身就是 out of xs
。如果 in 有重复项p
,xs
则它们将落在右侧。请注意,此选择将保留原始数组的自然顺序。