Sorting 为什么合并排序更适合于链表?

Sorting 为什么合并排序更适合于链表?,sorting,data-structures,quicksort,mergesort,Sorting,Data Structures,Quicksort,Mergesort,为什么在对列表进行排序而不是快速排序时,mergesort被认为是“最佳选择”? 我在网上观看的一次讲座中听到了这一点,并在几个网站上看到了这一点 find()的代价对快速排序的危害大于mergesort 合并排序对数据执行更多的“短程”操作,使其更适合于链表,而快速排序在随机访问数据结构中工作得更好。快速排序效率的主要来源之一是,计算机硬件经过优化,因此访问彼此相邻的内存位置往往比访问分散在内存中的内存位置更快。快速排序中的分区步骤通常具有良好的局部性,因为它访问前后相邻的连续数组元素。因此,

为什么在对列表进行排序而不是快速排序时,mergesort被认为是“最佳选择”? 我在网上观看的一次讲座中听到了这一点,并在几个网站上看到了这一点

find()的代价对快速排序的危害大于mergesort


合并排序对数据执行更多的“短程”操作,使其更适合于链表,而快速排序在随机访问数据结构中工作得更好。

快速排序效率的主要来源之一是,计算机硬件经过优化,因此访问彼此相邻的内存位置往往比访问分散在内存中的内存位置更快。快速排序中的分区步骤通常具有良好的局部性,因为它访问前后相邻的连续数组元素。因此,快速排序往往比其他排序算法(如heapsort)的性能要好得多,尽管它通常进行大致相同数量的比较和交换,因为在heapsort的情况下,访问更分散

此外,快速排序通常比其他排序算法快得多,因为它可以就地操作,而无需创建任何辅助数组来保存临时值。与合并排序之类的东西相比,这可能是一个巨大的优势,因为分配和取消分配辅助数组所需的时间是显而易见的。就地操作还可以改进quicksort的位置

使用链表时,这两个优点都不一定适用。因为链表单元格通常分散在内存中,所以访问相邻的链表单元格并没有局部性优势。因此,quicksort的一个巨大性能优势被消耗殆尽。类似地,就地工作的好处不再适用,因为merge-sort的链表算法不需要任何额外的辅助存储空间

尽管如此,快速排序在链表上仍然非常快。合并排序往往更快,因为它更平均地将列表一分为二,并且每次迭代执行合并的工作量比执行分区步骤的工作量要少


希望这有帮助

检查一下您所说的
find()
?在数据结构中查找条目是什么意思。对于链接的linst,您总是在前进/后退,就像播放磁带一样。在链接列表的情况下,您不需要使用数组上用于快速排序的随机访问分区函数。您可以通过遍历链表并将每个元素分布到三个列表中的一个来划分链表——一个“小于”列表、“大于”列表和一个“等于”列表,然后在后两个列表上递归。标准分区速度慢是正确的,但这并不会使链表快速排序速度变慢。在第3段的最后一行,您写道“同样,就地工作的好处不再适用,因为合并排序的链表算法不需要任何额外的辅助存储空间。”。为什么不需要辅助存储空间?@Geek我可能应该说“merge-sort的链表算法不需要O(n)个辅助存储空间。”标准的基于数组的合并算法要求在合并过程中分配额外的存储空间,因为元素需要移动。在使用链表进行合并排序时,只需重新链接元素,就可以在不分配外部数组的情况下移动元素。