Questions tagged «sorting»

关于某些排序关系对一组元素进行排序的算法问题。

11
为什么实践中quicksort比其他排序算法更好?
在标准的算法当然我们被教导快速排序是平均和ø (Ñ 2)在最坏的情况下。同时,还研究了其他排序算法,它们在最坏的情况下为O (n log n )(例如mergesort和heapsort),在最坏的情况下甚至是线性时间(例如bubbleort),但还有一些额外的内存需求。Ø (ñ 日志n )O(nlog⁡n)O(n \log n)Ø (ñ2)O(n2)O(n^2)Ø (ñ 日志n )O(nlog⁡n)O(n \log n) 快速浏览一下更多的运行时间后,自然可以说quicksort 应该不如其他高效。 另外,考虑到学生在基础编程课程中学习到,递归通常并不太好,因为它会占用过多的内存,等等。因此(尽管这不是一个真正的论点),但这样的想法是快速排序可能不是真的很好,因为它是一种递归算法。 那么,为什么在实践中快速排序优于其他排序算法?它与真实数据的结构有关吗?它与计算机中内存的工作方式有关吗?我知道有些记忆要比其他记忆快,但是我不知道这是否是这种违反直觉的表现的真正原因(与理论估计相比)。 更新1:一个规范的答案是说,平均情况的所涉及的常数小于其他O (n log n )算法所涉及的常数。但是,我还没有看到用正确的计算代替仅凭直觉的想法的适当理由。Ø (ñ 日志n )O(nlog⁡n)O(n\log n)Ø (ñ 日志n )O(nlog⁡n)O(n\log n) 无论如何,正如某些答案所暗示的那样,似乎真正的区别发生在内存级别,在这种级别上,实现利用了计算机的内部结构,例如使用高速缓存比RAM快。讨论已经是有趣的,但我还是喜欢看关于内存管理更详细,因为它似乎是在回答有什么关系。 更新2:有几个网页提供了排序算法的比较,其中有些比其他网页更出色(最著名的是sorting-algorithms.com)。除了提供不错的视觉辅助外,这种方法也无法回答我的问题。

2
快速排序分区:Hoare与Lomuto
Cormen中提到了两种快速排序分区方法: Hoare-Partition(A, p, r) x = A[p] i = p - 1 j = r + 1 while true repeat j = j - 1 until A[j] <= x repeat i = i + 1 until A[i] >= x if i < j swap( A[i], A[j] ) else return j …


5
在最坏的情况下,这种分类算法是Θ(n³)而不是Θ(n²)。
我刚开始学习数据结构和算法课程,我的助教为我们提供了以下用于对整数数组进行排序的伪代码: void F3() { for (int i = 1; i < n; i++) { if (A[i-1] > A[i]) { swap(i-1, i) i = 0 } } } 可能还不清楚,但是这里是我们要排序的数组的大小。nnnA 无论如何,助教都会向全班解释该算法的时间是(我认为是最坏的情况),但是无论我用反向排列的数组遍历多少次,在我看来,它应该是而不是。Θ (n 2)Θ (n 3)Θ(n3)Θ(n3)\Theta(n^3)Θ(n2)Θ(n2)\Theta(n^2)Θ(n3)Θ(n3)\Theta(n^3) 有人可以向我解释为什么这是Θ(n3)Θ(n3)Θ(n^3)而不是Θ(n2)Θ(n2)Θ(n^2)吗?

3
最坏情况
我很难找到可以给出最坏情况良好资源,而不是稳定排序算法。有人知道任何好的资源吗?O(nlnn)O(nln⁡n)O(n \ln n) 提醒一下,这意味着它使用传入的数组,并且排序算法仅允许使用恒定的额外空间。稳定意味着具有相同键的元素在排序数组中的顺序与原始数组中的顺序相同。 例如,朴素的合并排序是最坏的情况且稳定,但使用多余的空间。可以使标准的快速排序稳定,到位,但最坏的情况是。堆排序已经到位,最坏的情况是O(n \ ln n),但不稳定。 维基百科上有一张很好的图表,说明了哪种排序算法有哪些弊端。请注意,他们没有列出列出所有具有稳定性的三个条件的排序算法,最坏情况为O(n \ ln n)且处于适当状态。O(nlnn)O(nln⁡n)O(n \ln n)O(n)O(n)O(n)O(n2)O(n2)O(n^2)O(nlnn)O(nln⁡n)O(n \ln n)O(nlnn)O(nln⁡n)O(n \ln n) 我发现Katajainen,Pasanen和Teuhola撰写了一篇名为“ Practical in-place mergesort”的论文,该论文声称就地稳定的mergesortsort变种最坏的情况。如果我正确理解了它们的结果,它们将在数组的第一个和数组的后一个上递归使用(bottom-up?)mergesort,然后使用第二个作为合并的临时空间。我仍在阅读此书,因此感谢您提供有关我是否正确解释其结果的更多信息。O(nlnn)O(nln⁡n)O(n \ln n)1414\frac{1}{4}1212\frac{1}{2}1414\frac{1}{4} 我也会对最坏情况进行稳定快速排序感兴趣。据我了解,将快速排序修改为最坏的情况需要选择一个适当的枢轴,这将破坏原本通常会享有的稳定性。O(nlnn)O(nln⁡n)O(n \ln n)O(nlnn)O(nln⁡n)O(n \ln n) 这纯粹是理论上的兴趣,我没有实际应用。我只想知道具有所有这三个功能的算法。


5
将元素添加到排序数组
最快的方法是什么(从算法的角度以及实际的角度来看)? 我在按照以下思路思考。 我可以添加到数组的末尾,然后使用Bubblesort,因为它的最佳情况(开始时是完全排序的数组)接近于此,并且具有线性运行时间(最佳情况)。 另一方面,如果我知道我是从排序数组开始的,则可以使用二进制搜索来查找给定元素的插入点。 我的直觉是,第二种方法几乎是最优的,但好奇地想知道那里有什么。 如何最好地做到这一点?

3
为什么选择排序比气泡排序快?
维基百科上写道:“ ...选择排序几乎总是胜过气泡排序和侏儒排序。” 任何人都可以向我解释为什么选择排序比气泡排序更快的原因,尽管它们都具有: 最坏情况下的时间复杂度:Ø( ñ2)O(n2)\mathcal O(n^2) 比较数: Ø( ñ2)O(n2)\mathcal O(n^2) 最佳案例时间复杂度: 气泡排序:O(n )O(n)\mathcal O(n) 选择排序:Ø( ñ2)O(n2)\mathcal O(n^2) 平均案件时间复杂度: 气泡排序:Ø( ñ2)O(n2)\mathcal O(n^2) 选择排序:Ø( ñ2)O(n2)\mathcal O(n^2)

6
从一组对中生成组合而无需重复元素
我有一对。每对都具有(x,y)的形式,使得x,y属于范围内的整数[0,n)。 因此,如果n为4,那么我有以下几对: (0,1) (0,2) (0,3) (1,2) (1,3) (2,3) 我已经有一对了。现在,我必须使用n/2对构建一个组合,这样就不会重复任何整数(换句话说,每个整数在最终组合中至少出现一次)。以下是正确和不正确组合以更好地理解的示例 1. (0,1)(1,2) [Invalid as 3 does not occur anywhere] 2. (0,2)(1,3) [Correct] 3. (1,3)(0,2) [Same as 2] 一旦我有了配对,有人可以建议我一种生成所有可能组合的方法。

7
“平均”分配项目的算法
我正在寻找一种算法来分配列表中的值,以使结果列表尽可能“平衡”或“均匀分布”(用引号引起来,因为我不确定这些是描述它的最佳方法...稍后,我将提供一种方法来衡量结果是否优于其他结果。 因此,对于列表: [1, 1, 2, 2, 3, 3] 重新分配值之后,最好的结果之一是: [1, 2, 3, 1, 2, 3] 可能还会有其他结果,但当然,使用一组不太统一的值会变得更加复杂。 这是衡量结果是否优于其他方法的方法: 计算每个项目和具有相同值的下一个项目之间的距离。 计算该组距离的标准偏差。较低的分散度意味着更好的结果。 观察结果: 当计算距离并到达列表的末尾而没有找到具有相同值的项目时,我们返回到列表的开始。因此,最多将找到相同的项目,并且该项目的距离将是列表的长度。这意味着列表是循环的; 一个典型的列表有〜50个项目,其中〜15个不同值的数量不同。 所以: 结果[1, 2, 3, 1, 2, 3]是距离为[3, 3, 3, 3, 3, 3],标准差为0; 结果[1, 1, 2, 2, 3, 3]是距离为[1, 5, 1, 5, 1, 5],标准差为2; 这使第一个结果优于第二个结果(偏差越小越好)。 给定这些定义,我想知道应该搜索哪些算法或策略的线索。

1
排序为线性程序
数量惊人的问题使线性编程(LP)的问题自然减少。请参见[1]的第7章中的示例,例如网络流量,二分匹配,零和博弈,最短路径,线性回归形式甚至电路评估! 由于电路评估简化为线性规划,因此任何问题都必须具有线性规划公式。因此,通过简化为线性程序,我们有了一种“新”的排序算法。所以,我的问题是PPP 将对实数数组进行排序的线性程序是什么?nnn Reduce-to-LP-and-solve排序算法的运行时间是多少? 算法由S.达斯古普塔,C. PAPADIMITRIOU和U.瓦齐拉尼(2006)

3
为什么基数排序为
在基数排序中,我们首先按最低有效位排序,然后再按第二最低有效位排序,依此类推,最后得到排序列表。 现在,如果我们有数字的列表,则需要位来区分这些数字。因此,我们进行的基数排序次数将为。每遍花费时间,因此基数排序的运行时间为nnnlognlog⁡n\log nlognlog⁡n\log nO(n)O(n)O(n)O(nlogn)O(nlog⁡n)O(n \log n) 但是众所周知,它是线性时间算法。为什么?

4
排序(排序)5个元素所需的比较次数最少
找到排序(排序)五个元素所需的最少数量的比较,并设计一种算法,使用该数量的比较对这些元素进行排序。 解决方案:有5个!= 120个可能的结果。因此,用于排序过程的二叉树将至少具有7个级别。事实上, ≥120意味着≥7.但7比较是不够的。排序(排序)五个元素所需的最少比较次数是8。2h2h2^hhhh 这是我的实际问题:我确实找到了可以在8次比较中完成的算法,但是如何证明在7次比较中无法完成?

4
是否没有具有所有特定所需属性的排序算法?
在Sorting Algorithms网站上,提出以下索赔: 理想的排序算法将具有以下属性: 稳定:相同的键不会重新排序。 在原地运行,需要额外空间。O(1)O(1)O(1) 最坏情况键比较。O(n⋅lg(n))O(n⋅lg⁡(n))O(n\cdot\lg(n)) 最坏情况下的交换。O(n)O(n)O(n) 自适应:当数据接近排序或唯一键很少时,速度最高可达。O(n)O(n)O(n) 没有具有所有这些属性的算法,因此排序算法的选择取决于应用程序。 我的问题是 没有具有所有这些属性的[sorting]算法 如果是这样,为什么?这些属性的原因是什么使得它们同时无法实现?

4
接受随机比较器的排序算法
通用排序算法通常将一组数据进行排序,并使用一个比较器函数来比较两个单独的元素。如果比较器是顺序关系¹,则算法的输出是排序的列表/数组。 我想知道哪种排序算法实际上可以与不是顺序关系的比较器一起使用(特别是在每次比较时都返回随机结果的比较器)。所谓“工作”,是指他们继续返回其输入的排列并以其通常引用的时间复杂度运行(而不是总是降级为最坏的情况,或者陷入无限循环,或者缺少元素)。结果的顺序将是不确定的。更好的是,当比较器是投币游戏时,所得排序将是均匀分布。 从我粗略的脑力计算来看,似乎可以使用合并排序并保持相同的运行时成本并产生合理的随机排序。我认为,诸如快速排序之类的东西会退化,可能无法完成,也不公平。 如随机比较器所述,还有哪些其他排序算法(合并排序除外)可以工作? 作为参考,比较器是一个顺序关系,如果它是一个适当的函数(确定性)并且满足顺序关系的公理: 它是确定性的:compare(a,b)对于特定的对象a,b总是返回相同的结果。 它是可传递的: compare(a,b) and compare(b,c) implies compare( a,c ) 它是反对称的 compare(a,b) and compare(b,a) implies a == b (假设所有输入元素都是不同的,那么自反性就不是问题。) 随机比较器违反所有这些规则。但是,有些比较器不是顺序关系而是随机的(例如,它们可能只违反一个规则,并且仅针对集合中的特定元素)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.