Questions tagged «sorting»

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

3
基数排序的实际应用
当您知道键在某个有限范围内时,从根本上讲,基数排序非常快,例如,值在范围内。如果你只值转换为基础这需要时间,做了基础基数排序,然后再转换回原来的一个整体底座算法。[ 0 ... Ñ ķ - 1 ] ķ &lt; LG Ñ Ñ Θ (Ñ )ñ Θ (Ñ ķ )ñnn[ 0 … nķ− 1 ][0…nk−1][0\dots n^k -1]k &lt; lgñk&lt;lg⁡nk<\lg nñnnΘ (n )Θ(n)\Theta(n)ñnnΘ (千k )Θ(nk)\Theta(nk) 但是,我已经读到,实际上,基数排序通常比进行随机化的quicksort慢得多: 对于大型阵列,基数排序的指令数最少,但是由于其相对较差的缓存性能,其总体性能比合并排序和快速排序的内存优化版本差。 基数排序只是一种很好的理论算法,还是有通用的实际用途?

3
什么是最有效的恒定空间排序算法?
我正在寻找一种用于int数组的排序算法,该算法不会分配除数组大小以外的任何字节,并且仅限于两条指令: 交换:将下一个索引与当前索引交换; MOVE:将光标移至+1或-1索引; 也就是说,100仅交换index之后,就不能交换非相邻索引,也不能交换索引10。什么是最有效的算法-即使用较少总移动量的算法?


2
对5个整数进行排序,最多7个比较
如何排序5个整数的列表,以便在最坏的情况下需要进行7个比较?我不在乎执行了多少其他操作。我对整数没有什么特别的了解。 我尝试了几种不同的分而治之方法,这些方法使我只能进行8次比较,例如遵循mergesort方法,或者将mergesort与使用二进制搜索来组合以找到插入位置,但是每次我得到8次结果时,都会比较最坏的情况。 现在,我只是在寻找提示,而不是解决方案。

4
为什么随机化快速排序具有O(n log n)的最坏情况运行时间成本
随机快速排序是快速排序的扩展,其中随机选择枢轴元素。该算法在最坏情况下的时间复杂度是多少?据我说,它应该是Ø (ñ2)Ø(ñ2)O(n^2),因为最坏的情况是按排序顺序或反向排序顺序选择随机选择的枢轴。但是在某些文本[1] [2]中,最坏的情况是时间复杂度写为Ø (ñ 日志n)Ø(ñ日志⁡ñ)O(n\log{n}) 对不对

2
随机快速排序的优点是什么?
在他们的著作随机化算法, Motwani和拉加打开与他们的RandQS功能的说明引入-随机快速排序-其中所述枢轴,用于将所述组分成两个部分,是随机选择。 一段时间以来,我一直在绞尽脑汁(虽然动力不足),但是我无法看到该算法比每次简单地选择中间元素(索引而不是大小)有什么优势。 我想我看不到这是什么:如果初始集合是按随机顺序排列的,那么在集合中随机位置拾取元素和在固定位置拾取元素之间有什么区别? 有人可以简单地启发我吗?

4
为什么不对链接列表使用快速排序?
快速排序算法可以分为以下步骤 确定枢纽。 根据数据透视表对链接列表进行分区。 将链表递归分为两部分。 现在,如果我始终选择最后一个元素作为枢轴,那么识别枢轴元素(第一步)将花费时间。O(n)O(n)\mathcal O(n) 识别枢轴元素之后,我们可以存储其数据并将其与所有其他元素进行比较以识别正确的分区点(第二步)。当我们存储数据透视表数据时,每个比较将花费时间,而每个交换将花费O(1 )时间。因此,总共需要n 个元素的O(n )时间。O(1)O(1)\mathcal O(1)O(1)O(1)\mathcal O(1)O(n)O(n)\mathcal O(n)nnn 因此,递归关系为: 是 O(n log n ),它与带有链接列表的合并排序中的相同。T(n)=2T(n/2)+nT(n)=2T(n/2)+nT(n) = 2T(n/2) + nO(nlogn)O(nlog⁡n)\mathcal O(n \log n) 那么,为什么对链表而言合并排序比快速排序更受青睐?

4
Quicksort向孩子们解释
去年,我读了一篇有关“幼儿园量子力学”的精彩论文。这不是件容易的事。 现在,我想知道如何用最简单的词来解释quicksort。我如何证明(或至少是手波)平均复杂度为,对于幼儿园班级,最佳和最差情况是什么?还是至少在小学?Ø (ñ日志n )Ø(ñ日志⁡ñ)O(n \log n)

2
有效地插入到列表中,以最小化反转次数
假定两个可比较项的列表:u和s。令INV(u)为u中的求逆数。 我正在寻找一种有效的算法,以在不增加INV(u)的情况下将s的项插入u中。 基本上,我想将对象插入列表,同时保持“尽可能排序”,同时保持第一个列表的顺序。 例: u = [4,6,2,9,7] INV(u) = 3 ((4, 2), (6, 2) and (9, 7) s = [8,3,10] one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10] INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7)) different optimal solution u' …

1
是否可以在不比较邻居的情况下验证列表的排序?
一个ññn通过每一个项目比较它的邻居作为排序-Item列表可以验证。在我的应用程序中,我将无法将每个项目与其相邻项目进行比较:相反,有时会在遥远的元素之间进行比较。鉴于列表包含三个以上的项目,并且比较是唯一受支持的操作,因此是否存在一个比较“网络”,以证明列表已排序,但至少缺少一个直接的邻居比较? 形式上,对于元素Ë一世Ë一世e_i的序列,我有一组索引对( j ,k )(Ĵ,ķ)(j,k)对于这些索引,我知道ËĴ&gt; eķËĴ&gt;Ëķe_j > e_k,ËĴ= eķËĴ=Ëķe_j = e_k还是ËĴ&lt; eķËĴ&lt;Ëķe_j < e_k。存在一对(l ,l + 1 )(升,升+1个)(l,l+1),这对比较集中缺少该对。那么,是否有可能证明序列已排序?
14 sorting 

4
排序算法是否需要传递性
是否可以将排序算法与非传递性比较一起使用?如果是,为什么将传递性列为排序比较器的要求? 背景: 排序算法通常根据比较器函数C(x,y)对列表的元素进行排序,其中 C(x,y)=⎧⎩⎨−10+1if x≺yif x∼yif x≻yC(x,y)={−1if x≺y0if x∼y+1if x≻y\begin{array}{ll} C(x,y) = \begin{cases} -1 & {\text{if}}\ x\prec y \\ 0 & {\text{if}}\ x\sim y \\ +1 & {\text{if}}\ x\succ y \\ \end{cases} \end{array} 据我了解,此比较器的要求是: 自反: ∀x:C(x,x)=0∀x:C(x,x)=0\forall x: C(x,x)=0 反对称: ∀x,y:C(x,y)=−C(y,x)∀x,y:C(x,y)=−C(y,x)\forall x,y: C(x,y) = - C(y,x) 传递性: ∀x,y,z,a:C(x,y)=a∧C(y,z)=a⇒C(x,z)=a∀x,y,z,a:C(x,y)=a∧C(y,z)=a⇒C(x,z)=a\forall x,y,z, a: C(x,y)=a …

1
有趣的排序问题
给定一个带有编号球的管(随机)。管子上有孔以移走球。考虑一个操作的以下步骤: 您可以从孔中拾取一个或多个球,并记住拾取球的顺序。 您需要将管道向左侧倾斜,以使管道中的剩余球向左移动,并占据移除球所产生的空白空间。 您不应更改从烟斗中拾取编号的球的顺序。现在,您可以使用由球的运动产生的空余空间将它们重新放回管道中。 步骤1至3被视为一项操作。 找出按升序对编号的球进行排序所需的最少操作。 例如:如果管包含:[ 1 4 2 3 5 6 ] [1 4 2 3 5 6][1\ 4\ 2\ 3\ 5\ 6] 然后,我们可以取出和和,如果我们倾斜管的左侧,我们得到,和我们插入的顺序对管的端部以获得。4 5 6 [ 1 2 3 ] (4 5 6 )[ 1 2 3 4 5 6 ]445566 [1 2 3][1\ 2\ 3] (4 …

1
气泡排序中的预期交换次数
给定一个由整数组成的数组,可以以一定的概率,将数组中的每个元素增加固定数量。我必须找到使用气泡排序对数组进行排序所需的交换次数。一种一种AññNbbbp [ i ]p[一世]p[i]0 ≤ 我&lt; Ñ0≤一世&lt;ñ0 \leq i < n 我尝试了以下方法: 一个元素的概率用于可以很容易地从给定的概率来计算。A [ i ] &gt; A [ j ]一种[一世]&gt;一种[Ĵ]A[i] > A[j]我&lt; j一世&lt;Ĵi < j 使用上述方法,我计算出了预期的交换次数为: double ans = 0.0; for ( int i = 0; i &lt; N-1; i++ ){ for ( int j = i+1; j &lt; …

2
是否可以避免合并排序中的“除法”步骤?
因此,合并排序是一种分而治之的算法。在查看上图时,我在考虑是否有可能基本上绕过所有划分步骤。 如果您在原始数组上跳两次时迭代原始数组,则可以在索引i和i + 1处获取元素,然后将它们放入自己的排序数组中。一旦拥有所有这些子数组(如图所示,[[7,14],[3,12],[9,11]和[2,6]),您就可以简单地进行常规合并例程来获取排序数组。 遍历数组并立即生成所需的子数组是否比整体执行除法步骤效率低?

4
评估给定Bubblesort算法的平均时间复杂度。
考虑冒泡的伪代码: FOR i := 0 TO arraylength(list) STEP 1 switched := false FOR j := 0 TO arraylength(list)-(i+1) STEP 1 IF list[j] &gt; list[j + 1] THEN switch(list,j,j+1) switched := true ENDIF NEXT IF switched = false THEN break ENDIF NEXT 在评估平均时间复杂度时,我必须牢记的基本思想是什么?我已经完成了最坏情况和最佳情况的计算,但是我一直在认真思考如何评估内循环的平均复杂度,以形成方程。 最坏的情况是: ∑我= 0ñ(∑j = 0n − (i + …

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.