【发布时间】:2016-05-16 16:34:10
【问题描述】:
我们得到一个部分排序的数组 A,即 for i=1, 2, ..., n-k 我们有:
A[i]<= A[i+k]
为了对数组进行完全排序,我们至少需要O(n log k) 时间。
使这个公理永远为真的条件和解决方案是什么?
【问题讨论】:
-
你在哪里读到这个公理?
标签: arrays algorithm sorting data-structures
我们得到一个部分排序的数组 A,即 for i=1, 2, ..., n-k 我们有:
A[i]<= A[i+k]
为了对数组进行完全排序,我们至少需要O(n log k) 时间。
使这个公理永远为真的条件和解决方案是什么?
【问题讨论】:
标签: arrays algorithm sorting data-structures
你可以从这个问题中使用 shell 排序。在这个算法中,在每个阶段和一些增量 hk 之后,对于每个 i,我们有 a[ i ] ≤ a [ i + hk ]。对所有间隔 hk 的元素进行排序。据说这个数组是 hk 排序的。 shell 排序的输出是 1 排序的。 如果数组是 k 排序的,那么 shell 排序需要 O(log k) 来完全排序数组。每个阶段需要 O(n),那么总阶数是 O(n log k)。
假设我们要对这个数组进行排序:
这个数组是 4 排序的 (k=4)。排序这个,需要2个阶段 (h2 = 2, h3 = 1) 所以需要两个阶段(lg 4 或lg k)。 在每个阶段,有 n/k 个子数组必须排序。每个子数组都使用插入排序进行排序。每个子数组的排序顺序为 O(n)。 最后,总顺序 O(n*lg k) = O(n log k)。
【讨论】:
if array is k-sorted then shell sort need O(log k) for sort array completely - 最好展示一个证明的想法。