Questions tagged «quicksort»

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 …

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

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
排序算法是否需要传递性
是否可以将排序算法与非传递性比较一起使用?如果是,为什么将传递性列为排序比较器的要求? 背景: 排序算法通常根据比较器函数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 …

2
仅使用O(k)内存O(n)时间从给定序列中找到第k个最小元素
假设我们逐个读取数字的序列。如何仅使用单元存储器并在线性时间()中找到第个最小元素。我认为我们应该保存序列的前项,并在获得第个项时删除一个确定不能为第个最小元素的项,然后保存第个项。因此,我们应该有一个指标,在每个步骤中显示此不可用的术语,并且该指标应在每个步骤中快速更新。我从“ max”开始;但它无法快速更新;意味着如果我们考虑最大ķnnnkkkO (n )k k + 1 k k + 1O(k)O(k)O(k)O(n)O(n)O(n)kkkk+1k+1k+1kkkk+1k+1k+1然后在第一次删除中,我们错过了最大值,我们应该在搜索最大值,其原因时间不是线性的。也许我们应该更智能地保存前项。O(k)O(k)O(k)k(n−k)×O(k)(n−k)×O(k)(n-k)\times O(k)kkk 我该如何解决这个问题?

3
试图了解此Quicksort正确性证明
该证明是归纳证明,其内容如下: P(n)是“快速排序对长度为n的每个输入数组正确排序”的断言。 基本情况:每个长度为1的输入数组都已排序(P(1)成立) 归纳步骤:修复n => 2.修复一些长度为n的输入数组。 需要说明:如果对于所有k <n,P(k)成立,那么P(n)也成立 然后,他绘制围绕某个枢轴p划分的数组A。因此,他绘制了p,并将数组<p的部分称为第一部分,将> p的部分称为第二部分。部分1的长度= k1,部分2的长度为k2。通过“分区”子程序的正确性证明(之前已证明),枢轴p缠绕在正确的位置。 通过归纳假设:第1,第2部分通过递归调用正确排序。(使用P(K1),P(k2)) 所以:在递归调用之后,整个数组都将正确排序。 QED 我的困惑:我很难确切地看到这如何证明它的正确性。因此,我们假设P(k)确实适用于所有自然数k <n。 到目前为止,我看到的大多数归纳证明都类似:证明基本情况,并证明P(n)=> P(n + 1)。他们通常还涉及某种代数运算。这个证明似乎有很大的不同,我不理解如何将归纳概念应用到它。我可以合理地推断出Partition子例程的正确性是关键。因此,其正确性的理由如下:我们知道,每个递归调用都会围绕枢轴对数组进行分区。然后,该支点将处于其应有的位置。然后,每个子数组将进一步围绕枢轴进行划分,然后该枢轴将处于其正确位置。这样一直进行下去,直到得到长度为1的子数组,该数组被简单地排序了。 但是然后我们不假设P(k)满足所有k <n...。实际上我们正在展示它(因为Partition子例程将始终将一个元素置于其合法位置。)我们不是假设P (k)持有所有k
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.