- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看到使用合并排序而不是快速排序的唯一原因是列表是否已经(或大部分)排序。
归并排序需要更多空间,因为它会创建一个额外的数组用于存储,并且无论如何它都会比较每个项目。
另一方面,快速排序不需要额外的空间,也不会进行不必要的交换或比较。
因为大数据集或小数据集而说一个比另一个好似乎不符合直觉。
例如,引用 Geeksforgeeks 上的文章:
Merge sort can work well on any type of data sets irrespective of its size (either large or small).whereasThe quick sort cannot work well with large datasets.
接下来它说:
Merge sort is not in place because it requires additional memory space to store the auxiliary arrays.whereasThe quick sort is in place as it doesn’t require any additional storage.
我知道空间复杂度和时间复杂度是不同的。但这仍然是一个额外的步骤,当然,将所有内容写入具有大数据集的新数组将花费更多时间。
至于旋转问题,数据集越大,选择最低或最高项目的机会就越低(除非,同样,它是一个几乎排序的列表)。
那么为什么认为归并排序比快速排序更适合对大型数据集进行排序?
最佳答案
Why is Merge sort better for large arrays and Quick sort for small ones?It would seem unintuitive to say that because of large or small data sets one is better than the other.
假设数据集适合内存(未调出),问题不在于数据集的大小,而是导致 O(n2) 时间复杂度。快速排序可以使用中位数的中位数来保证最坏情况下的时间复杂度为 O(n log(n)),但这最终会使它比合并排序慢得多。如果递归级别变得太深,另一种方法是切换到堆排序,称为介绍排序,并在某些库中使用。
https://en.wikipedia.org/wiki/Median_of_medians
https://en.wikipedia.org/wiki/Introsort
Merge sort requires more space as it creates an extra array for storing, and no matter what it will compare every item.
合并排序的变体不需要任何额外的数据存储,但它们往往比标准合并排序慢 50% 以上。
Quick sort on the other hand does not require extra space, and doesn't swap or compare more than necessary.
子数组的每个元素都将与枢轴元素进行比较。随着相等元素个数的增加,Lomuto 分区方案变得更差,而 Hoare 分区方案变得更好。对于大量相等的元素,Hoare 分区方案不必要地交换相等的元素,但避免交换的检查通常比仅仅交换花费更多的时间。
sorting an array of pointers to objects
与快速排序相比,归并排序执行更多的移动但更少的比较。如果对指向对象的指针数组进行排序,则只会移动指针,但比较对象需要遵守指针以及比较对象所需的内容。在这种情况下以及比较比移动花费更多时间的其他情况下,归并排序更快。
large datasets that don't fit in memory
对于太大而无法放入内存的数据集,基于内存的排序用于对适合内存的数据集“ block ”进行排序,然后写入外部存储。然后使用 k-way 合并将外部存储上的“ block ”合并以生成排序的数据集。
关于arrays - 为什么合并排序对大数组更好,而快速排序对小数组更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65562749/
据我所知,根本不为元素呈现 HTML,或添加 display:none,似乎具有完全相同的行为:两者都使元素消失并且不与 HTML 交互。 我正在尝试禁用和隐藏一个复选框。所以HTML的总量很小;我无
我刚刚读了Android Architecture Tutorial: Developing an App with a Background Service (using IPC) .基本上是 让服
我有两个查询具有相同的结果,现在我想知道哪个查询更优化? 在选择中: select t1.*, sum(t2.value) as total_votes from table1 t1 left joi
有人告诉我,对于 I/O 绑定(bind)的应用程序,非阻塞 I/O 会更好。对于 CPU 密集型应用程序,阻塞 I/O 会好得多。我找不到这种说法的原因。试过谷歌,但很少有文章只是触及这个话题而没有
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我从 API 收到一个 json,我需要解析并修改一个属性值。问题是,我收到的 json 数据的嵌套结构不一致,我无法控制它。 这将禁止我指定在特定深度(如 parsedJson.children[0
我有 451 个城市的坐标。现在我想计算每个城市之间的距离,然后根据该距离对一些结果进行排序。现在我有两个选择: 我可以运行一个循环来计算每个可能的城市组合的距离并将它们存储到一个表中,这将产生大约
对于返回相同结果的不同查询,我有两个查询计划我想知道是否有人可以告诉我哪个“更好”,以及为什么。 SELECT * FROM bids order by (select ranking from us
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我有一个二维数组。我需要尽可能快地对其执行一些操作(函数每秒将被调用十几次,所以让它变得高效会很好)。 现在,假设我想获取元素 A[i][j],简单地使用 A[i][j] 在速度上有什么不同吗和 *(
在声明或使用字符串的代码中,我通常会看到开发人员这样声明它: string randomString = @"C:\Random\RandomFolder\ThisFile.xml"; 代替: str
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why don't CSS resets use '*' to cover all elements? 我正
如果我有一个包含许多重复项的 python 列表,并且我想遍历每个项目,而不是重复项,最好使用一个集合(如 set(mylist),或者找到另一种方法来创建没有重复的列表?我想只是循环遍历列表并检查重
在阅读常量接口(interface)反模式时,我发现没有实例的最终常量类比常量接口(interface)更好。 请解释一下怎么做? public interface ConstIfc { publ
我正在查看我继承的一些旧代码,我真的不喜欢某些地方的风格。我真的不喜欢它的外观的一件事是: bool func() { bool ret = true; ret &= test1();
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我经常发现自己试图使用 boost/QT 信号解耦对象。实现这一点的简单方法是针对我要通信的每个具体类型,创建一个新的信号和插槽签名并连接所有相关对象。这导致了访问者模式,理想情况下我想发出一个访问者
我正在 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 上阅读有关 lambda 的内容 在方法
public List getInts() { List xs = new ArrayList(); xs.add(1); // return Collections.unmo
我是一名优秀的程序员,十分优秀!