分区功能是否可以快速排序其参考位置? 如果有,怎么样?
我的意思是,与其他算法(如合并排序或堆排序)相比,quicksort中的内容是什么?它提供了引用的位置?
我也读过那个
"快速排序中的分区步骤通常具有出色的局部性,因为它可以访问前后附近的连续数组元素。
我没有得到它?
答案 0 :(得分:9)
通常,代码具有良好的引用局部性,如果存储器访问它使得往往顺序地位于少量存储器区域周围。例如,对数组进行线性搜索具有很大的引用局部性,因为所有元素在内存中看起来都相邻,但链接列表上的线性搜索具有较差的局部性,因为链表单元格不一定连续出现在内存中。
让我们来看看quicksort。 "肉"快速排序算法是分区步骤,其中元素围绕枢轴重新排列。实现分区算法有几种策略,其中大多数都具有出色的局部性。一种常见的方法是通过从阵列的末端向中心向内扫描,交换元件,只要它们相对不合适。该算法将大多数数组访问限制在两个区域 - 数组的末端 - 并按顺序访问元素,因此它具有很好的局部性。
另一种分区策略的工作方式是从数组的左侧向右扫描,存储两个指针,用于分隔包含较小值和较大值的区域。同样,数组访问都是顺序的,因此本地性非常好。
现在,与heapsort形成鲜明对比。在堆中,堆操作要求您重复比较一个位置的元素与索引是该元素索引的两倍或一半的元素。这意味着数组访问分散在整个数组中而不是顺序访问,因此总体位置更差。
由于合并步骤的工作原理,Mergesort实际上有一些不错的位置。但是,因为它维护了一个与输入数组一样大的辅助缓冲区数组,所以它必须支付额外内存的成本,因此它的访问比快速访问的访问更加分散。
答案 1 :(得分:2)
'引用的位置'指的是频繁访问的内存(时间位置)或连续的内存位置(空间位置),如数组中所示。基本上,这意味着机器(更具体地说,缓存)可以更容易地访问这些内存位置,因此更快。
考虑合并排序算法 它首先(虚拟地)将数组分成一半直到最小单位,即奇异元素( split 函数)。然后,它一次两个地比较数组,并以排序的方式合并它们( merge 函数)。考虑一个示例合并b / w两个长度 n 的数组,比如,arr [0] ... arr [n-1]和arr [n] ... arr [2n-1]。处理器必须获取两个阵列的第一个元素,即arr [0]和arr [n]。由于它们不是本地化,因此效率会降低。
将此与快速排序算法进行比较 partition 函数中的每个比较都在相邻的ie 本地化内存位置之间进行,因此它将具有缓存效率。
希望这有帮助!