如何快速排序缓存局部性而不是mergesort?

dev*_*nut 3 language-agnostic algorithm mergesort quicksort

在与quicksortvs 相关的答案中mergesort,通常表示quicksort利用缓存局部性(引用的局部性)比mergesort.

由于这两种方法遵循分而治之的方法,我不明白如何quicksort更加缓存友好.任何人都可以提供更多相关的见解吗?

此外,还有关于就地合并排序的注释.如果这是实用的(我不知道是否),合并排序也可以缓存友好吗?

Mat*_*ans 5

如果要对适合缓存的数组进行排序,那么quicksort将需要更少的内存访问,因为mergesort需要分配第二个数组.Quicksort会将数组加载到缓存中,然后在不等待内存的情况下继续运行.Mergesort将支付访问第二个阵列的额外费用.

如果你选的是不适合高速缓存的数组,然后快速排序仍从一个地方点获胜,因为他们改乘更小的部分进行排序,这两种算法很快就会到的部分放入高速缓存,以及通过上述论点,这些快速排序更快.在不适合缓存的排序的较高级别上,quicksort和mergesort从缓存局部性的角度来看几乎等效.

  • 不知道你的意思...就是没有。您发布的链接表明它们的就地合并排序需要 O(N^2) 时间。有一些更好、更简单的变体,需要 O( N log^2 N ),但仍然比常规合并排序慢。有一些复杂的类似合并排序的算法,可以用最少的额外空间获得 O( N log N ) 时间,但它们足够复杂,以至于在现实生活中没有使用。 (2认同)