Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Sorting 配分函数是否给出了快速排序的参考位置?_Sorting_Quicksort_Localityofreference - Fatal编程技术网

Sorting 配分函数是否给出了快速排序的参考位置?

Sorting 配分函数是否给出了快速排序的参考位置?,sorting,quicksort,localityofreference,Sorting,Quicksort,Localityofreference,配分函数是否给出了快速排序的参考位置? 如果有,如何解决 我的意思是,与其他算法(如合并排序或堆排序)相比,quicksort提供了什么样的引用位置 我也读到了 “快速排序中的分区步骤通常具有很好的局部性,因为它访问靠近前后的连续数组元素” 我没有理解它?一般来说,如果代码进行的内存访问倾向于顺序地位于内存的少量区域周围,那么代码具有良好的引用局部性。例如,数组上的线性搜索具有很大的引用局部性,因为所有元素在内存中都是相邻的,但是链表上的线性搜索具有很差的局部性,因为链表单元格不一定在内存中连续

配分函数是否给出了快速排序的参考位置? 如果有,如何解决

我的意思是,与其他算法(如合并排序或堆排序)相比,quicksort提供了什么样的引用位置

我也读到了

“快速排序中的分区步骤通常具有很好的局部性,因为它访问靠近前后的连续数组元素”


我没有理解它?

一般来说,如果代码进行的内存访问倾向于顺序地位于内存的少量区域周围,那么代码具有良好的引用局部性。例如,数组上的线性搜索具有很大的引用局部性,因为所有元素在内存中都是相邻的,但是链表上的线性搜索具有很差的局部性,因为链表单元格不一定在内存中连续出现

让我们看一下快速排序。快速排序算法的“肉”是分区步骤,其中元素围绕轴心重新排列。有几种实现分区算法的策略,其中大多数具有良好的局部性。一种常见的方法是从阵列的末端向中心向内扫描,在元素相对不合适时交换元素。该算法将大部分数组访问限制在两个区域(数组的末端),并按顺序访问元素,因此具有很强的局部性

另一种分区策略是从数组的左侧扫描到右侧,存储两个指针,将包含较小值和较大值的区域分隔开来。同样,数组访问都是顺序的,因此局部性非常好

现在,将其与希普索尔进行对比。在heapsort中,堆操作要求您将一个位置的元素与索引为该元素索引的两倍或一半的元素进行重复比较。这意味着数组访问分散在整个数组中,而不是按顺序进行,因此整体局部性要差得多


由于合并步骤的工作方式,Mergesort实际上具有相当好的局部性。但是,由于它维护一个与输入数组一样大的辅助缓冲区数组,它必须支付额外内存的成本,因此它的访问比快速排序的访问要分散一些。

“引用位置”指的是频繁访问的内存(时间位置)或连续的内存位置(空间位置)就像在数组中一样。基本上,这意味着机器(更具体地说,缓存)更容易,因此更快地访问这些内存位置

考虑合并排序算法。
它首先(实际上)将数组分成一半,直到最小的单元,即奇异元素(分割函数)。然后,它一次比较两个数组,并以排序方式合并它们(合并函数)。考虑样本合并B/W两个长度为N的数组,例如ARR〔0〕…ARR〔N-1〕和ARR[N]…ARR[2N-1]。处理器必须获取两个阵列的第一个元素,即arr[0]和arr[n]。由于它们没有本地化,因此效率会降低

将其与快速排序算法进行比较。
分区函数中的每个比较都发生在相邻的(即本地化的)内存位置之间,因此它将具有缓存效率


希望这有帮助

“合并排序”与“快速排序”的颜色非常相似,对吗?@Azim我的记忆是,它实际上没有最佳的位置。如果查看quicksort所做的扫描,则递归进行的每个扫描都会在其子类开始扫描的位置开始和停止,而mergesort不会在调用之间保留局部性。Mergesort还为辅助阵列支付了更多的费用。也就是说,我可能完全错了——尽管我怀疑这是正确的,并解释了为什么quicksort通常运行得更快。